Сервлет Spring MVC с учетными данными клиента WebClient и OAuth

Я использую WebClient в приложении на основе сервлета Spring MVC (нереактивное) для доступа к ресурсам через HTTP из других микросервисов. Некоторые ресурсы защищены потоком client_credentials OAuth2. Настроить RestTemplate с учетными данными клиента OAuth2 очень удобно, но теперь я застрял в настройке того же самого с помощью WebClient. Я всегда могу получить токен Bearer вручную, а затем установить его в методе WebCLient setBearerAuth(), но для этого потребуется много ручного подключения. Мой вопрос: поддерживает ли WebClient фильтр Exchange для автоматического потока учетных данных клиента при использовании в приложении Spring MVC?

ОБНОВЛЕНИЕ: я обнаружил ServletOAuth2AuthorizedClientExchangeFilterFunction, который должен решить проблему аутентификации учетных данных клиента. Я использую следующий код:

@Bean
WebClient webClient(ClientRegistrationRepository clientRegistrations, OAuth2AuthorizedClientRepository authorizedClients) {
    ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2 =
            new ServletOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrations, authorizedClients);
    oauth2.setDefaultClientRegistrationId("cart67");
    oauth2.setDefaultOAuth2AuthorizedClient(true);
    final WebClient webClient = WebClient.builder()
            .apply(oauth2.oauth2Configuration())
            .build();
    return webClient;
}

Но проблема в том, что этот WebClient не может выполнять вызовы на удаленный сервер ресурсов при вызове из запланированного задания. Я получаю следующую ошибку:

reactor.core.Exceptions$ErrorCallbackNotImplemented: 
           java.lang.IllegalArgumentException: request cannot be null
Caused by: java.lang.IllegalArgumentException: request cannot be null
at org.springframework.util.Assert.notNull(Assert.java:198)
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:

Все работает нормально, если я использую этот WebClient из контроллера MVC вместо запланированного задания. Любая помощь по этому поводу будет оценена.


person Munish Chandel    schedule 28.10.2019    source источник


Ответы (1)


Это может происходить из HttpSessionOAuth2AuthorizationRequestRepository, который используется для хранения OAuth2AuthorizationRequest в HttpSession. Поскольку ваше приложение отлично работает с входящими HTTP-запросами, обрабатываемыми вашим контроллером, это имеет смысл.

Возможно, вы захотите настроить свой OAuth2AuthorizedClientRepository по-другому и не хранить информацию в HttpSession.

документация по Spring Security предоставляет хорошую начните здесь, чтобы выбрать и настроить правильный.

person rieckpil    schedule 05.03.2020