将 OAuth2AuthorizedClient 解析为 Spring bean

Jus*_*hao 9 spring spring-security spring-security-oauth2

我有一个自动连接许多服务的控制器。这些服务是 HTTP Restful 调用,从各种数据源检索数据,但这些服务受 OAuth2.0 保护。

我正在尝试使用 Spring Security 来实现客户端凭据流,该流将允许这些服务安全地从这些受保护的数据源检索数据,但在解析服务层的 OAuth2AuthorizedClient 数据对象时遇到一些困难。

我一直在尝试通过 @RegisteredOAuth2AuthorizedClient注释解析授权客户端:

public void setAuthorizedClient(
      @RegisteredOAuth2AuthorizedClient("azure") OAuth2AuthorizedClient authorizedClient) {

    ClientRegistration clientRegistration =
        this.clientRegistrationRepository.findByRegistrationId("azure");
    System.out.println(clientRegistration);

    OAuth2AccessToken accessToken = authorizedClient.getAccessToken();

    jwtToken = accessToken.getTokenValue();
  }
Run Code Online (Sandbox Code Playgroud)

是否可以将OAuth2AuthorizedClient解析为 Spring bean,然后将其注入到另一个 bean 中?
或者有更好的方法来构建这样的系统吗?

谢谢!

小智 1

这是一个老问题,但我刚刚为自己解决了这个问题,所以这里是:

您可以创建一个为您返回 OAuth2AuthorizedClient 的 @Component,并将其注入到您需要的地方。这是一个示例方法:

  1. 创建一个提供者组件类
  2. 将现成的 OAuth2AuthorizedClientService bean 注入到您的类中
  3. 创建一个使用该服务的方法以返回 OAuth2AuthorizedClient
  4. 将您的提供者类注入到您的控制器中

例子:

@Component
public class OAuth2AuthorizedClientProvider {
  
  @Autowired
  private OAuth2AuthorizedClientService clientService;

  public OAuth2AuthorizedClient getClient() {
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    OAuth2AuthenticationToken oauthToken = (OAuth2AuthenticationToken) authentication;
    return clientService.loadAuthorizedClient(oauthToken.getAuthorizedClientRegistrationId(), oauthToken.getName());
  }
Run Code Online (Sandbox Code Playgroud)

然后在控制器中使用 OAuth2AuthorizedClientProvider,如下所示:

@RestController
public class Endpoint {

  @Autowired
  private final OAuth2AuthorizedClientProvider oauth2AuthorizedClientProvider;

  @GetMapping("/mymethod")
  public String mymethod() {

    return oauth2AuthorizedClientProvider.getClient().getAccessToken();
  }
}
Run Code Online (Sandbox Code Playgroud)