Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 是否支持Spring Boot WebClient OAuth2客户端\u凭据?_Spring Boot_Spring Security_Spring Security Oauth2_Spring Webflux - Fatal编程技术网

Spring boot 是否支持Spring Boot WebClient OAuth2客户端\u凭据?

Spring boot 是否支持Spring Boot WebClient OAuth2客户端\u凭据?,spring-boot,spring-security,spring-security-oauth2,spring-webflux,Spring Boot,Spring Security,Spring Security Oauth2,Spring Webflux,我正在尝试创建一个SpringBootREST应用程序,该应用程序必须对另一个受OAuth2保护的SpringBoot应用程序进行远程REST调用(使用grant类型的client_凭据) 第一个应用程序使用反应式WebClient调用第二个OAuth2 REST应用程序 我已使用授权类型“客户端凭据”配置了WebClient(请参阅下面的代码) 但每次我给第一个应用程序打邮递员电话时,我都会遇到以下例外: 来自DefaultOAuth2AuthorizationRequestResolver的

我正在尝试创建一个SpringBootREST应用程序,该应用程序必须对另一个受OAuth2保护的SpringBoot应用程序进行远程REST调用(使用grant类型的client_凭据)

第一个应用程序使用反应式WebClient调用第二个OAuth2 REST应用程序

我已使用授权类型“客户端凭据”配置了WebClient(请参阅下面的代码)

但每次我给第一个应用程序打邮递员电话时,我都会遇到以下例外:

来自DefaultOAuth2AuthorizationRequestResolver的“IllegalArgumentException:Id为…”的客户端注册的授权授予类型(客户端凭据)无效”

WebClient是否真的支持“客户端凭据”。。。还是我遗漏了什么

问候

  • 第一个应用程序代码:
  • 第二个应用程序代码:

  • SpringBoot版本2.1.4

  • spring-security-oauth2-client:5.1.5.RELEASE

您必须使用
.apply(oauth.oauth2Configuration())
而不是
.filter(oauth)
,请参阅:

提供一种简单的机制,通过将令牌作为承载令牌,使用
OAuth2AuthorizedClient
发出OAuth2请求。它还提供了查找
OAuth2AuthorizedClient
的机制。此类旨在用于servlet环境中。用法示例:

OAuth2AuthorizedClientChangeFilterFunction oauth2=新的OAuth2AuthorizedClientChangeFilterFunction(authorizedClientService);
WebClient WebClient=WebClient.builder()
.apply(oauth2.oauth2Configuration())
.build();
Mono响应=网络客户端
.get()
.uri(uri)
.attributes(oauth2AuthorizedClient(authorizedClient))
// ...
.retrieve()
.bodyToMono(String.class);
以及:

13.1网络客户端OAuth2设置

第一步是确保正确设置WebClient。下面是在servlet环境中设置WebClient的示例:

@Bean
网络客户端网络客户端(客户端注册库客户端注册,
OAuth2AuthorizedClient(授权客户){
ServletOAuth2AuthorizedClient ChangeFilterFunction oauth=
新的ServletOAuth2AuthorizedClient ChangeFilterFunction(客户端注册、授权客户端);
//(可选)显式选择使用oauth2Login隐式提供访问令牌
//setDefaultOAuth2AuthorizedClient(true);
//(可选)设置默认的ClientRegistration.registrationId
//oauth.setDefaultClientRegistrationId(“客户注册id”);
返回WebClient.builder()
.apply(oauth2.oauth2Configuration())
.build();
}

嗯,我终于能够让我的代码工作了

。。。是的,WebClient确实支持OAuth2和客户机_凭证(部分)

为了解决我的问题,我必须禁用oauth2自动配置,并创建自己的WebSecurity配置适配器的实现

我之所以说“部分”是因为WebClient当前版本的spring security(5.1.x)在令牌过期后(对于客户端凭据)不会要求新令牌。只有在版本5.2.0.M2或(M1)中,当令牌过期时,它才会请求新令牌


谢谢:)

文档中使用了
.apply(oauth2.oauth2Configuration())
而不是
.filter(oauth)
。你为什么用另一种方式来解释它呢?我尝试了.apply.apply(oauth2.oauth2Configuration())而不是.filter(oauth),它开始工作了。。。。两次中有一次。。。在调试模式下。取得了一些进展。谢谢你能添加完整的堆栈吗?这看起来应该是成功的,我不认为它的失败是因为客户端代码。想分享一下你是怎么做到的吗?
public WebClient messageWebClient(
        ClientRegistrationRepository clientRegistrations,
        OAuth2AuthorizedClientRepository authorizedClients,
        ClientHttpConnector clientHttpConnector
) {

    ServletOAuth2AuthorizedClientExchangeFilterFunction oauth =
            new ServletOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrations, authorizedClients);

    oauth.setDefaultClientRegistrationId("message");

    return WebClient.builder()
            .baseUrl(MESSAGE_BASE_URL)
            .clientConnector(clientHttpConnector)
            .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
            .defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
            .filter(oauth)
            .filter(logRequest())
            .build();
}

@Bean
public ClientRegistrationRepository  clientRegistrations() {
    ClientRegistration clientRegistration = ClientRegistration
            .withRegistrationId("message")
            .clientId("client")
            .clientSecret("secret")
            .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS)
            .tokenUri("http://localhost:8081/oauth/token")
            .build();

    return new InMemoryClientRegistrationRepository(clientRegistration);
}