如何像 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 网络客户端的多种可能方法之一
我正在通过 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 网络客户端的多种可能方法之一