使用AWS签署Spring WebClient HTTP请求

时间:2019-06-23 16:12:51

标签: java spring amazon-web-services reactive-programming spring-webflux

我想AWS sign由Spring的响应WebClient触发我的HTTP请求。要签署请求,我需要访问以下内容:URL,HTTP方法,查询参数,标头和请求正文字节。

我从写ExchangeFilterFunction开始。由于有了ClientRequest界面,我可以访问所需的一切,但请求正文除外:

@Component
public class AwsSigningInterceptor implements ExchangeFilterFunction
{
    private final AwsHeaderSigner awsHeaderSigner;

    public AwsSigningInterceptor(AwsHeaderSigner awsHeaderSigner)
    {
        this.awsHeaderSigner = awsHeaderSigner;
    }

    @Override
    public Mono<ClientResponse> filter(ClientRequest request, ExchangeFunction next)
    {
        Map<String, List<String>> signingHeaders = awsHeaderSigner.createSigningHeaders(request, new byte[]{}, "es", "us-west-2"); // should pass request body bytes in place of new byte[]{}

        ClientRequest.Builder requestBuilder = ClientRequest.from(request);

        signingHeaders.forEach((key, value) -> requestBuilder.header(key, value.toArray(new String[0])));

        return next.exchange(requestBuilder.build());
    }
}

在较早的春季版本中,我们将RestTemplateClientHttpRequestInterceptor一起使用。在这种情况下,主体的字节是暴露的,因此可以签名。

如我在WebClient的情况下所见,Spring将身体作为Publisher处理,因此我不确定ExchangeFilterFunction是否是一个很好的起点。

我应该如何签名HTTP请求?

0 个答案:

没有答案