Весенняя загрузка: клиентский вызов Feign не работает с oauth2, но работает в браузере - PullRequest
0 голосов
/ 09 декабря 2018

Имея 2 микросервиса, один сервис для отдыха, другой - сервис websocket.У службы Websocket есть симулированный клиент для общения со службой отдыха.

При вызове службы отдыха из инструмента браузера (например, почтальона) вызов работает правильно.Мы передаем только заголовок Authorization со значением Bearer XXXXX

При вызове из feign без перехватчика мы получаем 401: несанкционированный, что является правильным поведением.

При добавлении этого перехватчика в кодовую базуЕсли XXXXX является реальным токеном, конечно, мы получаем 403

@Component
public class FeignOauth2Interceptor implements RequestInterceptor {
    private static final String AUTHORIZATION_HEADER = "Authorization";   
    @Override
    public void apply(RequestTemplate template) {
        SecurityContext securityContext = SecurityContextHolder.getContext();
        Authentication authentication = 
        securityContext.getAuthentication();
        template.header(AUTHORIZATION_HEADER, "Bearer XXXXX");
    }
}

Перехватчик вызывается, поскольку после добавления кода мы видим другой код ошибки, мы перешли с 401 на 403.

Чего нам здесь не хватает ??

Заранее спасибо

1 Ответ

0 голосов
/ 10 декабря 2018

Я думаю, что не очень хорошая идея жестко закодировать ваш токен в перехватчике, вы можете получить токен из OAuth2AuthenticationDetails :

@Bean
public RequestInterceptor requestTokenBearerInterceptor() {

    return new RequestInterceptor() {
        @Override
        public void apply(RequestTemplate requestTemplate) {
            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            if(authentication == null) return;
            OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) authentication.getDetails();
            requestTemplate.header("Authorization", "Bearer " + details.getTokenValue());                   
        }
    };
}

Также вы можете использовать OAuth2FeignRequestInterceptor , который получает ваш токен из контекста и обновляет его сам, когда это необходимо.На мой взгляд, это лучшее решение.Вы можете найти пример использования здесь: https://stackoverflow.com/a/53454703/10697598

...