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



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

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

@RegisteredOAuth2AuthorizedClient("back-end") OAuth2AuthorizedClient authorizedClient

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

现在我不想要显式的方法,只想在webclient请求中直接添加.attributes(clientRegistrationId("new-back-end")),有任何方法来检查令牌吗?或者至少从请求中获取OAuth2AuthorizedClient ?

示例代码:

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

•您可以通过使用' ServerOAuth2AuthorizedClientExchangeFilterFunction '来做同样的事情通过从‘ClientRequest.attributes()’解析‘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 . getreregistrationid () '作为请求属性:-

@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()));
}
}

请查看以下链接获取更多信息:-

如何在Webflux功能端点中访问OAuth2AuthorizedClient ?

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

最新更新