0

我在基于 Spring MVC servlet 的应用程序(非反应式)中使用 WebClient 来通过 HTTP 从其他微服务访问资源。很少有资源受 client_credentials OAuth2 流保护。使用 OAuth2 客户端凭据配置 RestTemplate 非常方便,但现在我无法使用 WebClient 进行相同的配置。我总是可以手动获取 Bearer 令牌,然后在 WebCLientsetBearerAuth()方法中设置它,但这需要大量的手动管道。我的问题是 - 在 Spring MVC 应用程序中使用时,WebClient 是否支持用于自动客户端凭据流的 Exchange 过滤器?

更新: 我发现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:

如果我从 MVC 控制器使用这个 WebClient 而不是预定的作业,事情会正常工作。对此的任何帮助将不胜感激。

4

1 回答 1

1

这可能来自HttpSessionOAuth2AuthorizationRequestRepository用于将 存储OAuth2AuthorizationRequestHttpSession. 由于您的应用程序可以很好地处理由控制器处理的传入 HTTP 请求,因此这是有道理的。

您可能希望以OAuth2AuthorizedClientRepository不同方式配置您的信息,并且不要将信息存储在HttpSession.

Spring Security 文档在这里提供了一个良好的起点来选择和配置正确的文档。

于 2020-03-05T05:52:02.847 回答