如何在 Spring Boot 中使用 WebClient 配置 OAuthClient2Password

问题描述

我需要使用 OAuth2Password 通过资源所有者用户名和密码连接到其他服务。我已经配置了 webclient 和 client 注册如下:

@豆 WebClient webClient(ReactiveClientRegistrationRepository clientRegistrations) {

    TcpClient tcpClient = TcpClient.create().option(ChannelOption.CONNECT_TIMEOUT_MILLIS,10000)
            .doOnConnected(connection -> {
                connection.addHandlerLast(new ReadTimeoutHandler(10000,TimeUnit.MILLISECONDS));
                connection.addHandlerLast(new WriteTimeoutHandler(10000,TimeUnit.MILLISECONDS));
            });

    InMemoryReactiveOAuth2AuthorizedClientService authClientService = new InMemoryReactiveOAuth2AuthorizedClientService(
            clientRegistrations);
    ServerOAuth2AuthorizedClientExchangeFilterFunction oauth = new ServerOAuth2AuthorizedClientExchangeFilterFunction(
            new AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager(clientRegistrations,authClientService));

    return WebClient.builder().clientConnector(new ReactorClientHttpConnector(HttpClient.from(tcpClient)))
            .filter(oauth).build();
}

public ReactiveClientRegistrationRepository clientRegistrationRepository() {

    Map<String,Object > map = new HashMap<>();
    map.put(OAuth2AuthorizationContext.USERNAME_ATTRIBUTE_NAME,USERNAME);
    map.put(OAuth2AuthorizationContext.PASSWORD_ATTRIBUTE_NAME,PASSWORD);
 
    ClientRegistration clientRegistration;
    clientRegistration = ClientRegistration.withRegistrationId("configured")
            .authorizationGrantType(AuthorizationGrantType.PASSWORD).clientId(CLIENTID)
            .clientSecret(CLIENTSECRET).
          .providerConfigurationMetadata(map).userInfoAuthenticationMethod(AuthenticationMethod.FORM)
            .tokenUri(tokenURL).build();
    
   ;

    return new InMemoryReactiveClientRegistrationRepository(clientRegistration);
}

我在 webclient 调用调用它:

  webclient
      .get().
      .url(......)
    
   .attributes(ServerOAuth2AuthorizedClientExchangeFilterFunction.clientRegistrationId("configured"))
  .retrieve().bodytoMono(String.class);

我总是收到 401 Unauthorized 错误,而且我没有收到任何令牌。

你能帮我知道我是否配置错误吗?

问候, 斯蒂芬

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)