如何像 RestTemplate 一样从 WebClient 获取 accesstoken?

How to get accesstoken from WebClient like in RestTemplate?

我正在通过 Spring Security Oauth 2.x 迁移到 Spring security 5.2 并遇到以下拦截器。 如我所见,不再使用 OAuth2RestTemplate,建议使用 WebClient。所以我正在更改我的代码库以使 webclient 工作。

在 Oauth2 中,我们可以选择使用 oAuth2RestTemplate.getAccessToken() 直接从 RestTemplate 获取令牌,我在 WebClient 中找不到类似的东西。这是调用外部微服务。 是否有任何选项可以从 webclient 获取 accesstoken?还是那里的处理方式不同?

与往常一样,在使用 spring 安全性时,很多事情会按照约定自动进行配置。含义:你应该熟悉与oauth相关的spring安全配置。

spring security docu or one of the many good Baeldung articles on this topic (maybe this one helps: https://www.baeldung.com/spring-oauth-login-webflux).

是您学习的良好起点

在正确配置的情况下,以下方法将创建一个 WebClient,它具有在过滤方法中按需自动创建的正确的 oauth 令牌。

在这种情况下,ReactiveOAuth2AuthorizedClientManager 类型的 Bean 会处理这个问题。该 bean 在列表中创建。 2.

此外,您需要配置 oauth 服务器 url 和凭据。请参阅清单 3 中的一个简单示例。

此示例无需您处理访问令牌即可运行。


    @Bean
    public WebClient oauthWebClient(
        final WebClient.Builder webClientBuilder,
        @Qualifier("authorizedClientManager") final ReactiveOAuth2AuthorizedClientManager manager) {
        final ExchangeStrategies exchangeStrategies =
            ExchangeStrategies.builder()
                              .codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(EXCHANGE_BYTE_COUNT))
                              .build();
        final ServerOAuth2AuthorizedClientExchangeFilterFunction oauth = new ServerOAuth2AuthorizedClientExchangeFilterFunction(manager);
        oauth.setDefaultClientRegistrationId(authenticationProperties.getClientId());
        // set more properties if needed
        // oauth.set ...

        return webClientBuilder
            .exchangeStrategies(exchangeStrategies)
            .baseUrl(apiProperties.getBaseUrl())
            .filter(oauth)
            .build();
    }

清单 1:创建 WebClient bean

    @Bean
    public ReactiveOAuth2AuthorizedClientManager authorizedClientManager(
        final ReactiveClientRegistrationRepository clientRegistrationRepository,
        final ReactiveOAuth2AuthorizedClientService authorizedClientService) {
        final ReactiveOAuth2AuthorizedClientProvider authorizedClientProvider =
            ReactiveOAuth2AuthorizedClientProviderBuilder
                .builder()
                .clientCredentials()
                .build();
        final AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager authorizedClientManager =
            new AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager(clientRegistrationRepository, authorizedClientService);
        authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);
        return authorizedClientManager;
    }

清单 2:创建一个 OAuth2 授权客户端管理器 bean

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: https://your-oauth-server.com/auth/realms/your-realm
      client:
        provider:
          your-provider:
            issuer-uri: https://your-oauth-server.com/auth/realms/your-realm
        registration:
          your-provider:
            client-id: your-client-id
            client-secret: ${your_client_secret} # from an environment variable
            scope: openid
            authorization-grant-type: client_credentials

清单 3:配置 spring 网络客户端的多种可能方法之一