WebClient与ClientRegistrationId作为请求属性(使用OAuth 2.0)



我正在寻找一个工作示例,当我将请求属性添加到WebClient时,我可以设置ClientRegistrationId。春天提供的例子。它不适合我(医生。春天)。io (5.2.12)) .

当我尝试这个例子(默认的ClientRegistrationId):

@Bean
WebClient webClient(ReactiveClientRegistrationRepository clientRegistrations,
ServerOAuth2AuthorizedClientRepository authorizedClients) {
ServerOAuth2AuthorizedClientExchangeFilterFunction oauth =
new ServerOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrations, authorizedClients);
// (optional) explicitly opt into using the oauth2Login to provide an access token implicitly
// oauth.setDefaultOAuth2AuthorizedClient(true);
// (optional) set a default ClientRegistration.registrationId
oauth.setDefaultClientRegistrationId("MyClRegId");
return WebClient.builder()
.filter(oauth)
.build();
}

调用端点:

ResponseSpec responseSpec = this.webClient.get().uri("/NumberOrders").retrieve();

应用程序。属性:

spring.security.oauth2.client.registration.MyClRegId.authorization-grant-type=client_credentials
spring.security.oauth2.client.registration.MyClRegId.client-id=myteam
spring.security.oauth2.client.registration.MyClRegId.client-secret=12349875
spring.security.oauth2.client.provider.MyClRegId.token-uri=https://something/token
spring.security.oauth2.client.registration.MyClRegId.scope=OIDC

我得到以下错误:

肇因:java.lang.IllegalArgumentException: serverWebExchange cannot be null

如果我尝试将ClientRegestrationId设置为请求属性,那么spring。IO示例(docs.spring。. io(5.2.12))发生另一个错误(方法clientRegistrationId(String) is undefined…):

ResponseSpec responseSpec = this.webClient
.get()
.attributes(clientRegistrationId("client-id"))
.uri("/NumberOrders")
.retrieve();

这个错误并不奇怪,因为这个方法真的不存在,但是有人有这样一个方法的例子吗?属性要求Consumer<String,>>attributesConsumer作为设置ClientRegistrationId的输入。当然,它应该工作没有第一个错误(serverwebeexchange不能为空)。

我在这里找到了一个工作设置WebClient OAuth2(按时钟回答),但ClientRegistrationId是在Bean中设置的。我想在调用端点时设置它。因此,我可以在application.properties中使用不同的配置(具有不同的clientregistrationid)。

也许有一种方法来设置ClientRegistrationId,同时设置WebClient.Builder?

我搜索了很多,但我找不到任何答案。提前感谢您的帮助。

我使用的是依赖性:

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.4</version>
<relativePath />
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

可以使用

webClient.get()
.uri("http://localhost:8084/retrieve-resource")
.attributes(
ServerOAuth2AuthorizedClientExchangeFilterFunction
.clientRegistrationId("bael"))
.retrieve()
// ...

是完整的代码:https://www.baeldung.com/spring-webclient-oauth2

这是您在前面提到的示例中需要的配置:

AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager authorizedClientManager

serverwebeexchange不能为空当webClient调用不是由用户操作触发时抛出,例如kafka事件触发webClient调用,所以没有Request Context。

AuthorizedClientService……bean定义为考虑由事件、计划任务线程触发的webClient调用。

服务间通信

最新更新