java - Spring Boot : Calling an OAuth2 protected REST service

标签 java spring spring-boot kotlin oauth-2.0

我有一个使用 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/

相关文章:

java - libgdx:切换屏幕时图像不会消失

java - Admob 没有填满所有宽度

spring - 如何从Spring Data REST产生的表示中删除超媒体元素?

java - Spring 启动 : use database config from WildFly's standalone. xml

java - 如何使用java单击selenium中的按钮而无需名称或ID

java - 如何在不丢失或更改任何数据的情况下安全地将 RSA 加密和解密的字节转换为字符串?

spring - 远程属性源

java - Spring MVC 的 Cookie 问题

java - Spring中如何配置多个环境(开发/发布)?

java - 即使我的 DDL 脚本和 JPA 实体同步,Hibernate 也会抛出验证异常 "wrong column type encountered in column"