Подписать Spring WebClient HTTP-запрос с помощью AWS - PullRequest
0 голосов
/ 23 июня 2019

Я бы хотел AWS подписать мой HTTP-запрос, запущенный реактивным WebClient Spring. Для подписания запроса мне нужен доступ к следующим адресам: 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());
    }
}

В старых весенних версиях мы использовали RestTemplate с ClientHttpRequestInterceptor . В этом случае байты тела были выставлены, так что подпись была возможна.

Как я вижу в случае WebClient Spring обрабатывает тело как Publisher , поэтому я не уверен, является ли ExchangeFilterFunction хорошим местом для Начните.

Как подписать HTTP-запрос?

...