我有一个使用 Spring Boot 构建的现有 REST API。在我的服务层功能之一上,我需要调用受 OAuth2(客户端凭据)保护的外部 REST 服务。
使用 Spring Boot 2.3,我实现了 OAuth2RestTemplate
已弃用,所以我继续使用 WebClient
.
按照本教程 - https://www.baeldung.com/spring-webclient-oauth2 , 我现在有我的 WebClientConfig
类如下:
@Configuration
class WebClientConfig {
@Bean
fun webClient(
clientRegistrations: ClientRegistrationRepository?,
authorizedClients: OAuth2AuthorizedClientRepository?): WebClient? {
val oauth2 = ServletOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrations, authorizedClients)
oauth2.setDefaultOAuth2AuthorizedClient(false)
oauth2.setDefaultClientRegistrationId("test")
return WebClient.builder()
.apply(oauth2.oauth2Configuration())
.build()
}
}
在我的属性文件中,我有:spring:
security:
oauth2:
client:
registration:
test:
client-id: <redacted>
client-secret: <redacted>
authorization-grant-type: client_credentials
provider:
test:
token-uri: <redacted>
我什至无法判断这是否有效,因为在访问与此 OAuth2 身份验证无关的 API 上的其他端点时,我不断收到以下错误:java.lang.IllegalArgumentException: Invalid Authorization Grant Type (client_credentials) for Client Registration with Id: test
我不知所措,因为我无法克服这个问题......任何帮助将不胜感激!谢谢!
最佳答案
这对我有用:
@Bean
public WebClient webClient(OAuth2AuthorizedClientManager authorizedClientManager) {
ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2Client = new ServletOAuth2AuthorizedClientExchangeFilterFunction(
authorizedClientManager);
oauth2Client.setDefaultClientRegistrationId("test");
return WebClient.builder()
.apply(oauth2Client.oauth2Configuration())
.build();
}
@Bean
public OAuth2AuthorizedClientManager authorizedClientManager(
ClientRegistrationRepository clientRegistrationRepository,
OAuth2AuthorizedClientRepository authorizedClientRepository) {
OAuth2AuthorizedClientProvider authorizedClientProvider = OAuth2AuthorizedClientProviderBuilder.builder()
.refreshToken()
.clientCredentials()
.build();
DefaultOAuth2AuthorizedClientManager authorizedClientManager = new DefaultOAuth2AuthorizedClientManager(
clientRegistrationRepository, authorizedClientRepository);
authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);
return authorizedClientManager;
}
关于java - Spring Boot : Calling an OAuth2 protected REST service,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62834123/