Spring boot 是否支持Spring Boot WebClient OAuth2客户端\u凭据?
我正在尝试创建一个SpringBootREST应用程序,该应用程序必须对另一个受OAuth2保护的SpringBoot应用程序进行远程REST调用(使用grant类型的client_凭据) 第一个应用程序使用反应式WebClient调用第二个OAuth2 REST应用程序 我已使用授权类型“客户端凭据”配置了WebClient(请参阅下面的代码) 但每次我给第一个应用程序打邮递员电话时,我都会遇到以下例外: 来自DefaultOAuth2AuthorizationRequestResolver的“IllegalArgumentException:Id为…”的客户端注册的授权授予类型(客户端凭据)无效” WebClient是否真的支持“客户端凭据”。。。还是我遗漏了什么 问候Spring boot 是否支持Spring Boot WebClient OAuth2客户端\u凭据?,spring-boot,spring-security,spring-security-oauth2,spring-webflux,Spring Boot,Spring Security,Spring Security Oauth2,Spring Webflux,我正在尝试创建一个SpringBootREST应用程序,该应用程序必须对另一个受OAuth2保护的SpringBoot应用程序进行远程REST调用(使用grant类型的client_凭据) 第一个应用程序使用反应式WebClient调用第二个OAuth2 REST应用程序 我已使用授权类型“客户端凭据”配置了WebClient(请参阅下面的代码) 但每次我给第一个应用程序打邮递员电话时,我都会遇到以下例外: 来自DefaultOAuth2AuthorizationRequestResolver的
- 第一个应用程序代码:
- 第二个应用程序代码:
- SpringBoot版本2.1.4
- spring-security-oauth2-client:5.1.5.RELEASE
.apply(oauth.oauth2Configuration())
而不是.filter(oauth)
,请参阅:
提供一种简单的机制,通过将令牌作为承载令牌,使用OAuth2AuthorizedClient
发出OAuth2请求。它还提供了查找OAuth2AuthorizedClient
的机制。此类旨在用于servlet环境中。用法示例:
OAuth2AuthorizedClientChangeFilterFunction oauth2=新的OAuth2AuthorizedClientChangeFilterFunction(authorizedClientService);
WebClient WebClient=WebClient.builder()
.apply(oauth2.oauth2Configuration())
.build();
Mono响应=网络客户端
.get()
.uri(uri)
.attributes(oauth2AuthorizedClient(authorizedClient))
// ...
.retrieve()
.bodyToMono(String.class);
以及:
13.1网络客户端OAuth2设置
第一步是确保正确设置WebClient。下面是在servlet环境中设置WebClient的示例:
@Bean
网络客户端网络客户端(客户端注册库客户端注册,
OAuth2AuthorizedClient(授权客户){
ServletOAuth2AuthorizedClient ChangeFilterFunction oauth=
新的ServletOAuth2AuthorizedClient ChangeFilterFunction(客户端注册、授权客户端);
//(可选)显式选择使用oauth2Login隐式提供访问令牌
//setDefaultOAuth2AuthorizedClient(true);
//(可选)设置默认的ClientRegistration.registrationId
//oauth.setDefaultClientRegistrationId(“客户注册id”);
返回WebClient.builder()
.apply(oauth2.oauth2Configuration())
.build();
}
嗯,我终于能够让我的代码工作了 。。。是的,WebClient确实支持OAuth2和客户机_凭证(部分) 为了解决我的问题,我必须禁用oauth2自动配置,并创建自己的WebSecurity配置适配器的实现 我之所以说“部分”是因为WebClient当前版本的spring security(5.1.x)在令牌过期后(对于客户端凭据)不会要求新令牌。只有在版本5.2.0.M2或(M1)中,当令牌过期时,它才会请求新令牌
谢谢:)文档中使用了
.apply(oauth2.oauth2Configuration())
而不是.filter(oauth)
。你为什么用另一种方式来解释它呢?我尝试了.apply.apply(oauth2.oauth2Configuration())而不是.filter(oauth),它开始工作了。。。。两次中有一次。。。在调试模式下。取得了一些进展。谢谢你能添加完整的堆栈吗?这看起来应该是成功的,我不认为它的失败是因为客户端代码。想分享一下你是怎么做到的吗?
public WebClient messageWebClient(
ClientRegistrationRepository clientRegistrations,
OAuth2AuthorizedClientRepository authorizedClients,
ClientHttpConnector clientHttpConnector
) {
ServletOAuth2AuthorizedClientExchangeFilterFunction oauth =
new ServletOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrations, authorizedClients);
oauth.setDefaultClientRegistrationId("message");
return WebClient.builder()
.baseUrl(MESSAGE_BASE_URL)
.clientConnector(clientHttpConnector)
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
.filter(oauth)
.filter(logRequest())
.build();
}
@Bean
public ClientRegistrationRepository clientRegistrations() {
ClientRegistration clientRegistration = ClientRegistration
.withRegistrationId("message")
.clientId("client")
.clientSecret("secret")
.authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS)
.tokenUri("http://localhost:8081/oauth/token")
.build();
return new InMemoryClientRegistrationRepository(clientRegistration);
}