当前位置: 首页 > 知识库问答 >
问题:

记录webclient库发出的OAuth调用

董元徽
2023-03-14

我有一个使用微服务架构的应用程序,服务受Spring OAuth2客户端凭据授予类型的保护。我们使用spring WebClient和spring OAuth客户端库从一个服务调用另一个服务,因为它透明地处理OAuth凭据的获取。

正如我们所知,Spring(OAuth客户端)会调用授权服务器,在Auth服务器没有令牌或当前令牌过期时,从Auth服务器请求一个新令牌。每当Spring(OAuth客户端)调用OAuth服务器时,我们如何在客户端记录语句?我们希望记录此语句,以查看OAuth客户端库调用授权服务器的频率。

public WebClient webClient()
{
        return WebClient.builder()
                        .apply(filter())
                        .baseUrl("http://localhost:8082/resource")
                        .build();
}
    
public Consumer<Builder> filter()
{
        ServletOAuth2AuthorizedClientExchangeFilterFunction oAuth = 
                new ServletOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager);
        oAuth.setDefaultClientRegistrationId("my-client");
        return oAuth.oauth2Configuration();
}

共有1个答案

冯宏浚
2023-03-14

定义向授权服务器发送令牌请求时记录的自定义令牌客户端。

@Slf4j
public class LoggingClientCredentialsTokenResponseClient
    implements OAuth2AccessTokenResponseClient<OAuth2ClientCredentialsGrantRequest> {

  private DefaultClientCredentialsTokenResponseClient delegate =
      new DefaultClientCredentialsTokenResponseClient();

  @Override
  public OAuth2AccessTokenResponse getTokenResponse(
      OAuth2ClientCredentialsGrantRequest clientCredentialsGrantRequest) {

    log.debug("Sending request {}", clientCredentialsGrantRequest);
    var response = delegate.getTokenResponse(clientCredentialsGrantRequest);
    log.debug("Received response {}", response);
    return response;
  }
}

创建使用自定义令牌客户端的授权客户端管理器。

  @Bean
  public OAuth2AuthorizedClientManager authorizedClientManager(
      ClientRegistrationRepository clientRegistrationRepository,
      OAuth2AuthorizedClientService authorizedClientService) {

    var authorizedClientProvider = OAuth2AuthorizedClientProviderBuilder.builder()
        .clientCredentials(builder ->
            builder.accessTokenResponseClient(
                new LoggingClientCredentialsTokenResponseClient()))
        .build();

    var authorizedClientManager =
        new AuthorizedClientServiceOAuth2AuthorizedClientManager(
            clientRegistrationRepository, authorizedClientService);
    authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);
    return authorizedClientManager;
  }

创建使用授权客户端管理器的WebClient。

  @Bean
  public WebClient oauth2WebClient(
      WebClient.Builder webClientBuilder,
      OAuth2AuthorizedClientManager authorizedClientManager) {

    var oauth2Filter =
        new ServletOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager);
    oauth2Filter.setDefaultClientRegistrationId("my-client");

    return webClientBuilder.apply(oauth2Filter.oauth2Configuration())
        .baseUrl("http://localhost:8082/resource")
        .build();
  }
 类似资料:
  • 我正在尝试使用Spring 5 WebClient记录请求。你知道我怎样才能做到吗? (我使用的是Spring5和Spring靴2) 代码目前如下所示:

  • 我是Spring WebClient的新手。有人能建议记录来自另一个WebService的REST请求和响应的最佳方法吗? 我已经看到了一个在问题中记录请求的示例,但也必须记录响应和POST调用的请求。如何记录Spring 5 WebClient调用 谢谢你。

  • 我正在使用Spring WebClient下载文件,如下所示: 文件下载得很好。我唯一挣扎的是,当响应为200时,我只想像这样记录一行: 我也试过了,但没有得到我想要的-如何记录Spring WebClient响应 简而言之,是否有某种方法可以在不编写单独的的情况下实现上述目标?在这里感到迷失和无知。这方面的任何指针都将受到高度赞赏。

  • 我试图从DynamoDB表中设置ElasticSearch导入过程。我已经创建了AWS Lambda并启用了带有触发器的DynamoDB流,该触发器为每个添加/更新的记录调用我的Lambda。现在我想执行初始种子操作(将DynamoDB表中当前的所有记录导入ElasticSearch)。我该怎么做?有没有办法让表中的所有记录都“重新处理”并添加到流中(这样我的lambda就可以处理它们)?还是最好

  • 我的日志功能在cxf client 3.3.4版本中运行良好,但当soap调用出现超时错误(java.net.SocketTimeoutException)时,不会记录入站消息。请告知如何/配置什么以获取要记录的入站邮件? log4j。xml

  • 在spring中提供了三种不同的方法来连接响应端: 我的目标是记录每个响应(标题状态代码),不管结果如何。 我怎样才能知道上述哪种方法是正确的?