使用 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()));
}
}
请找到以下链接以获取更多信息:-
我有一个连接到 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()));
}
}
请找到以下链接以获取更多信息:-