使用 WebFlux 时如何在请求中检索 OAuth2AuthorizedClient

How to Retrieve OAuth2AuthorizedClient in a request when using WebFlux

我有一个连接到 Azure AD 的后端 (Springboot) 应用程序和一个访问它的前端应用程序。在前端,我要求用户使用 MSAL 进行身份验证,并使用 On-Behalf-Of 流程将此身份验证传递给 BE。

在前端,当我尝试指定注册客户端时,我简单地使用:

@RegisteredOAuth2AuthorizedClient("back-end") OAuth2AuthorizedClient authorizedClient

我正在尝试创建另一个后端应用程序,我现有的后端将使用 OBO 流程调用并通过身份验证。为了检查来自用户的初始令牌与 BE 将提供给新 BE 应用程序的令牌之间的差异,我创建了一个日志来从这些客户端获取令牌,例如 authorizedClient.getAccessToken().getTokenValue().

现在我不想使用显式方法,只想直接在网络客户端请求中添加 .attributes(clientRegistrationId("new-back-end")),有什么方法可以检查令牌吗?或者至少从请求中获取 OAuth2AuthorizedClient?

示例代码:

 webClient.get()
          .uri(new URI(resourceBaseUri + resourceEndpoint))
          .attributes(clientRegistrationId("new-be-app"))
          .retrieve()
          .bodyToMono(String.class)
          .block();

• 您可以使用 'ServerOAuth2AuthorizedClientExchangeFilterFunction' 根据需要执行相同操作,通过从 [=14] 解析 ‘OAuth2AuthorizedClient’ 来确定要使用的客户端=].以下代码显示了如何将 ‘OAuth2AuthorizedClient’ 设置为请求属性:-

@GetMapping("/")
 public Mono<String> index(@RegisteredOAuth2AuthorizedClient("okta") 
 OAuth2AuthorizedClient authorizedClient) {
  String resourceUri = ...

   return webClient
        .get()
        .uri(resourceUri)
        .attributes(oauth2AuthorizedClient(authorizedClient))
        .retrieve()
        .bodyToMono(String.class)
        ...
        .thenReturn("index");
   }

注意:- ‘oauth2AuthorizedClient()’‘ServerOAuth2AuthorizedClientExchangeFilterFunction’.

中的一个静态方法

此外,请注意以下代码显示了如何将 ‘ClientRegistration.getRegistrationId()’ 设置为请求属性:-

@GetMapping("/")
 public Mono<String> index() {
 String resourceUri = ...

  return webClient
        .get()
        .uri(resourceUri)
        .attributes(clientRegistrationId("okta"))
        .retrieve()
        .bodyToMono(String.class)
        ...
        .thenReturn("index");
      }

您也可以使用下面的代码来达到您的目的:-

   @Component
   @RequiredArgsConstructor
public class OAuth2Utils {

private final ServerOAuth2AuthorizedClientRepository authorizedClientRepository;

public Mono<OAuth2AuthorizedClient> extractOAuth2AuthorizedClient(ServerRequest request) {
    return request.principal()
            .filter(principal -> principal instanceof OAuth2AuthenticationToken)
            .cast(OAuth2AuthenticationToken.class)
            .flatMap(auth -> authorizedClientRepository.loadAuthorizedClient(auth.getAuthorizedClientRegistrationId(), auth, request.exchange()));
}
}

请找到以下链接以获取更多信息:-

https://docs.spring.io/spring-security/reference/reactive/oauth2/client/authorized-clients.html#_providing_the_authorized_client