【发布时间】:2019-09-17 13:15:54
【问题描述】:
我正在尝试创建一个 Spring Boot REST 应用程序,该应用程序必须对另一个受 OAuth2 保护的 Spring Boot 应用程序(具有授权类型 client_credentials)进行远程 REST 调用。
第一个应用程序正在使用 Reactive WebClient 来调用第二个 OAuth2 REST 应用程序。
我已经用 grant_type "client_credentials" 配置了 WebClient(参见下面的代码)
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);
}
但是每次我对第一个应用程序进行 Postman 调用时,我都会遇到以下异常:
“IllegalArgumentException:无效的授权授予类型 (client_credentials) 用于 Id 的客户端注册:...”来自 DefaultOAuth2AuthorizationRequestResolver
WebClient 真的支持“client_credentials”吗...还是我遗漏了什么?
问候
- 第一个应用程序代码: https://github.com/fdlessard/SpringBootOauth2WebClient
第二个应用程序代码: https://github.com/fdlessard/SpringBootOAuth2Message
SpringBoot 2.1.4 版
- spring-security-oauth2-client: 5.1.5.RELEASE
【问题讨论】:
-
在文档中使用的是
.apply(oauth2.oauth2Configuration())而不是.filter(oauth)。为什么你是另一种方式? -
我尝试了 .apply .apply(oauth2.oauth2Configuration()) 而不是 .filter(oauth) 并且它开始工作....在调试中部分是两次中的 1 次...模式。取得了一些进展。谢谢
-
你能添加完整的堆栈吗?看起来它应该是成功的,我不认为它的失败是因为客户端代码。
标签: spring-boot spring-security spring-security-oauth2 spring-webflux