9

Я пытаюсь сделать HTTP-запросы к домену AWS Elasticsearch, защищенному политикой доступа IAM. Мне нужно sign эти просьбы для их разрешения AWS. Я использую Jest, который, в свою очередь, использует Apache HttpComponents Client.Подписание HTTP-запросов AWS с клиентом Apache HttpComponents

Это, кажется, обычный случай использования, и мне было интересно, есть ли там какая-то библиотека, которую я могу использовать поверх Apache HttpComponents Client для подписания всех запросов.

ответ

10

Я думаю, что нашел! :)

Этот проект, похоже, делает именно то, что я хочу: aws-signing-request-interceptor, описанный как «Запрос перехватчика для клиента Apache, который подписывает запрос на AWS. Первоначально создан для поддержки службы AWLS Elasticearch с использованием клиента Jest»..

Редактировать: I forked the project, чтобы соответствовать моим потребностям (Java 7, временные учетные данные STS), и он работает красиво.

Вот пример использования (здесь без STS временных учетных данных):

String region = "us-east-1"; 
String service = "es"; 
String url = "???"; // put the AWS ElasticSearch endpoint here 

DefaultAWSCredentialsProviderChain awsCredentialsProvider = new DefaultAWSCredentialsProviderChain(); 
final AWSSigner awsSigner = new AWSSigner(awsCredentialsProvider, region, service,() -> new LocalDateTime(DateTimeZone.UTC)); 

JestClientFactory factory = new JestClientFactory() { 
    @Override 
    protected HttpClientBuilder configureHttpClient(HttpClientBuilder builder) { 
     builder.addInterceptorLast(new AWSSigningRequestInterceptor(awsSigner)); 
     return builder; 
    } 
}; 
factory.setHttpClientConfig(new HttpClientConfig.Builder(url) 
     .multiThreaded(true) 
     .build()); 
JestClient client = factory.getObject(); 
+0

Да, это работает и для меня :) – panipsilos

+0

Привета Эрика Я следует ссылке GitHub предоставленной Вами. Мы сталкиваемся с запрещенной ошибкой. Другой вопрос - в обычном клиенте-шутке мы проходим конечную точку упругого поиска. Но здесь мы передаем только имя службы и регион. Можете ли вы предоставить образец кода или руководство для решения нашей проблемы. –

+0

Привет @MohanShanmugam. Запрещенная ошибка, вероятно, связана с неправильной конфигурацией политики доступа или с плохими учетными данными. Я добавил пример использования в ответе. Надеюсь это поможет. –

1

Это не работает в случае запроса асинхронного.

Обновление:

Игнорировать мой предыдущий комментарий. Он работает после добавления перехватчика для асинхронных запросов также:

final AWSSigningRequestInterceptor requestInterceptor = new AWSSigningRequestInterceptor(awsSigner); 
      factory = new JestClientFactory() { 
       @Override 
       protected HttpClientBuilder configureHttpClient(HttpClientBuilder builder) { 
        builder.addInterceptorLast(requestInterceptor); 
        return builder; 
       } 
       @Override 
       protected HttpAsyncClientBuilder configureHttpClient(HttpAsyncClientBuilder builder) { 
        builder.addInterceptorLast(requestInterceptor); 
        return builder; 
       } 
      }; 
Смежные вопросы