Привет человек, у меня та же проблема, вы можете показать весь код. Мой resftul API работает нормально, но у меня есть проблемы со стороны клиента.

я есть микросервисная архитектура, обе они защищены весенней безопасностью токенами JWT.

Поэтому, когда я вызываю свой первый микросервис, я хочу взять токен JWT и отправить запрос другому сервису, используя эти учетные данные.

Как я могу получить токен и отправить его другому сервису?

 MatMat13 окт. 2017 г., 14:39
Было бы здорово с некоторыми примерами кода :)

Ответы на вопрос(2)

Авторизация: Носитель. Для его получения вы можете получить любое значение заголовка с помощью @RequestHeader () в вашем контроллере:

@GetMapping("/someMapping")
public String someMethod(@RequestHeader("Authorization") String token) {

}

Теперь вы можете поместить токен в заголовок для следующего запроса:

HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", token);

HttpEntity<RestRequest> entityReq = new HttpEntity<RestRequest>(request, headers);

Теперь вы можете передать HttpEntity в ваш шаблон отдыха:

template.exchange("RestSvcUrl", HttpMethod.POST, entityReq, SomeResponse.class);

Надеюсь я смогу помочь

 paddy_8917 окт. 2017 г., 13:39
Или вы можете использовать совет контроллера (аннотация уровня класса) вместо перехватчика. Там у вас также есть возможность вводить заголовки
 dragonalvaro16 окт. 2017 г., 12:08
кажется довольно солидным решением, но это немного "ручная работа". Я искал, чтобы использовать другое решение с использованием перехватчика, как ClientHttpRequestInterceptor. Но я не знаю, как получить токен оттуда. Например, библиотека Sleuth с TraceInterceptorConfiguration делает то же самое. Не нужно вручную добавлять заголовки
 eis14 окт. 2017 г., 18:14
именно так. так же, как вы сделали бы с любым заголовком.
Решение Вопроса

создав собственный фильтр

public class RequestFilter implements Filter{



    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        String token = httpServletRequest.getHeader(RequestContext.REQUEST_HEADER_NAME);

        if (token == null || "".equals(token)) {
            throw new IllegalArgumentException("Can't retrieve JWT Token");
        }

        RequestContext.getContext().setToken(token);
        chain.doFilter(request, response);

    }

    @Override
    public void destroy() { }

    @Override
    public void init(FilterConfig arg0) throws ServletException {}


}

Затем установка в моем конфиге

    @Bean
public FilterRegistrationBean getPeticionFilter() {

    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setFilter(new RequestFilter());
    registration.addUrlPatterns("/*");
    registration.setName("requestFilter");

    return registration;
}

Имея это в виду, я создал другой класс с переменной ThreadLocal для передачи токена JWT от контроллера к перехватчику Rest Templace

public class RequestContext {

public static final String REQUEST_HEADER_NAME = "Authorization";

private static final ThreadLocal<RequestContext> CONTEXT = new ThreadLocal<>();

private String token;

public static RequestContext getContext() {
    RequestContext result = CONTEXT.get();

    if (result == null) {
        result = new RequestContext();
        CONTEXT.set(result);
    }

    return result;
}

public String getToken() {
    return token;
}

public void setToken(String token) {
    this.token = token;
}

}

public class RestTemplateInterceptor implements ClientHttpRequestInterceptor{

@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {

    String token = RequestContext.getContext().getToken();

    request.getHeaders().add(RequestContext.REQUEST_HEADER_NAME, token);

    return execution.execute(request, body);

}

}

Добавить перехватчик в конфиг

  @PostConstruct
public void addInterceptors() {
    List<ClientHttpRequestInterceptor> interceptors = restTemplate.getInterceptors();
    interceptors.add(new RestTemplateInterceptor());
    restTemplate.setInterceptors(interceptors);
}
 Krismorte12 сент. 2018 г., 20:15
Привет человек, у меня та же проблема, вы можете показать весь код. Мой resftul API работает нормально, но у меня есть проблемы со стороны клиента.

Ваш ответ на вопрос