oauth2.0 如何像在RestTemplate中一样从WebClient中获取访问权限?

k97glaaz  于 2023-01-08  发布在  其他
关注(0)|答案(2)|浏览(206)

我正在进行Spring Security Oauth 2.x到Spring Security 5.2的迁移,遇到了下面的拦截器。正如我所看到的,OAuth2RestTemplate不再使用了,取而代之的是WebClient。所以我正在修改我的代码库,使webclient工作。
在Oauth2中,我们有一个选项可以使用oAuth2RestTemplate.getAccessToken()直接从RestTemplate获取令牌,我在WebClient中找不到类似的东西。这是为了调用一个外部微服务。是否有任何选项可以从WebClient获取accesstoken?或者它在那里以不同的方式处理?

mxg2im7a

mxg2im7a1#

和往常一样,在使用spring security时,很多事情都是按照约定自动配置的。您应该熟悉与oauth相关的Spring安全配置。
学习spring security docu或Baeldung关于此主题的许多优秀文章之一是一个很好的起点(也许这篇文章会有所帮助:https://www.baeldung.com/spring-oauth-login-webflux)。
正确配置之后,下面的方法将创建一个WebClient,其中包含根据需要在filter方法中自动创建的正确的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 web客户端的多种可能方法之一**
xfyts7mz

xfyts7mz2#

检查是否有帮助

public String getToken() {

return webClient
    .post()
    .uri(uri)
    .body(
        BodyInserters.fromFormData(GRANT_TYPE, PASSWORD)
            .with(USERNAME, userName)
            .with(PASSWORD, password)
            .with(CLIENT_ID, clientId)
            .with(CLIENT_SECRET, clientSecret))
    .retrieve()
    .bodyToMono(JsonNode.class)
    .map(tokenResponse -> tokenResponse.get(ACCESS_TOKEN).textValue())
    .cache(Duration.ofMinutes(30))
    .block();

  }

相关问题