如何在spring-security-oauth2-client:5.5.0 lib中记录访问令牌?

ryhaxcpt  于 2023-05-07  发布在  Spring
关注(0)|答案(1)|浏览(115)

我想记录访问令牌请求的响应正文,然后屏蔽它。像这样

{"access_token": "F******", "expires_in": 3600, "token_type": "Bearer"}

我该怎么做?我找到了接收令牌的位置,但不知道如何记录。

org.springframework.security.oauth2.client.endpoint.DefaultClientCredentialsTokenResponseClient#getTokenResponse
wj8zmpe1

wj8zmpe11#

DefaultClientCredentialsTokenResponseClient没有内置的可观察性。此外,它将JSON响应直接反序列化到OAuth2AccessTokenResponse对象中,因此无论如何都不存在可以记录的中间字符串表示。为了记录来自访问令牌端点的响应,您需要自己使用RestTemplateWebClient向该端点发出请求。
一种替代方法是调整HTTP客户端库上的日志记录,以便它在与请求沿着发送时输出Bearer令牌。但是,它不会被掩盖。
另一种选择是在WebClient.Builder中添加一个简单的交换函数,如下面所示。这将允许您记录具有分配的承载令牌的出站请求,并且仍然允许您适当地屏蔽敏感值。

webClientBuilder.exchangeFunction(request -> {
    val exchangeFunction = ExchangeFunctions.create(new ReactorClientHttpConnector());
    builder.exchangeFunction(request -> {
        var headers = request.headers().entrySet().stream()
            .map(entry -> entry.getKey() + "=" + (entry.getKey().equalsIgnoreCase("Authorization") ? "***" : entry.getValue()))
            .collect(Collectors.joining(", "));
        if (!headers.isEmpty()) headers = ", " + headers;
        var message = String.format("<%1$s %2$s%3$s>%n", request.method(), request.url(), headers);
        log.info(message);
        return exchangeFunction.exchange(request);
});

相关问题