Spring boot: фиктивный вызов клиента не работает с oauth2, но работает в браузере

Имея 2 микросервиса, один оставшийся сервис - это сервис веб-сокетов. Служба 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.

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

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


person Olivier Sinnaeve    schedule 09.12.2018    source источник


Ответы (1)


Я думаю, что не стоит жестко кодировать ваш токен в перехватчике, вы можете получить токен из 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

person Anatoliy Korovin    schedule 09.12.2018
comment
Спасибо за помощь. Код не окончательный, я действительно использую OAuth2AuthenticationDetails. Проблема заключалась в неправильном URL-адресе, притворяется, что отправляет 403, когда конечная точка не найдена. - person Olivier Sinnaeve; 10.12.2018