我有一个连接到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