如何在WebClient中实现类似RestTemplate获取AccessToken的功能
Spring Security 5.2 WebClient 令牌获取与使用方案
Spring Security 5.2 配套的WebClient OAuth2 组件设计逻辑和旧版OAuth2RestTemplate不同,WebClient本身没有直接提供获取AccessToken的方法,令牌管理逻辑被独立拆分到专属组件中,以下是对应解决方案:
场景1:仅需调用外部微服务(官方推荐用法)
无需手动获取AccessToken,通过配置OAuth2过滤器,WebClient会自动完成令牌的获取、刷新、请求头注入全流程,代码侵入性最低。
配置示例(Servlet环境)
@Bean WebClient oauth2WebClient(ClientRegistrationRepository clientRegistrationRepository, OAuth2AuthorizedClientRepository authorizedClientRepository) { ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2Filter = new ServletOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrationRepository, authorizedClientRepository); // 可选配置:设置默认使用的OAuth2客户端ID,固定调用同一授权方服务时可简化调用代码 oauth2Filter.setDefaultClientRegistrationId("your-oauth-client-id"); return WebClient.builder() .apply(oauth2Filter.oauth2Configuration()) .build(); }
调用示例
// 直接发起请求,无需手动处理令牌逻辑 Mono<String> serviceResponse = oauth2WebClient.get() .uri("外部微服务请求地址") .retrieve() .bodyToMono(String.class);
如果是响应式WebFlux环境,将过滤器替换为ServerOAuth2AuthorizedClientExchangeFilterFunction即可。
场景2:业务需要手动获取AccessToken字符串
如果你的逻辑确实需要拿到明文令牌做其他处理,可通过Spring自动装配的OAuth2AuthorizedClientManager组件获取,WebClient内部也是基于该组件完成令牌获取的。
代码示例
@Autowired private OAuth2AuthorizedClientManager authorizedClientManager; public String getAccessToken() { // 从安全上下文获取当前用户认证信息,客户端凭证模式可传入匿名Authentication实例 Authentication currentAuth = SecurityContextHolder.getContext().getAuthentication(); // 构造授权请求 OAuth2AuthorizeRequest authRequest = OAuth2AuthorizeRequest .withClientRegistrationId("your-oauth-client-id") .principal(currentAuth) .build(); // 执行授权,获取包含令牌的客户端实例 OAuth2AuthorizedClient authorizedClient = authorizedClientManager.authorize(authRequest); // 获取AccessToken明文 return authorizedClient.getAccessToken().getTokenValue(); }
提示:该组件会自动处理令牌过期刷新逻辑,无需自己判断令牌有效期。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

