9

Próbuję wykonać żądania HTTP do domeny AWS Elasticsearch chronionej przez zasady dostępu IAM. Muszę sign tych żądań, aby zostały autoryzowane przez AWS. Używam Jest, które z kolei używają Apache HttpComponents Client.Podpisywanie żądań HTTP AWS za pomocą klienta Apache HttpComponents

To wydaje się być typowym przypadkiem użycia i zastanawiałem się, czy jest tam jakaś biblioteka, którą mogę użyć na górze Apache HttpComponents Client, aby podpisać wszystkie żądania.

Odpowiedz

10

Myślę, że znalazłem! :)

Ten projekt wydaje się zrobić dokładnie to, co chcę: aws-signing-request-interceptor, opisany jako „Żądanie Interceptor dla Klienta Apache że podpisującej żądanie AWS pierwotnie stworzony w celu wspierania AWS” Elasticsearch usługi przy użyciu klienta żartem”..

Edytuj: I forked the project w celu dopasowania do moich potrzeb (Java 7, tymczasowe poświadczenia STS) i działa dobrze.

Oto przykład użycia (tu bez STS tymczasowe poświadczenia):

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

Tak, to działa również dla mnie :) – panipsilos

+0

Cześć Eric Mam następujący link GitHub dostarczonego przez Ciebie. Stoimy w obliczu zakazanego błędu. Kolejne pytanie to normalny klient, któremu przekazujemy elastyczny punkt końcowy wyszukiwania. Ale tutaj przekazujemy tylko nazwę usługi i region. Czy możesz podać przykładowy kod lub wskazówki, aby rozwiązać nasz problem? –

+0

Witam @MohanShanmugam. Niedozwolony błąd jest prawdopodobnie spowodowany błędną konfiguracją lub błędnymi danymi uwierzytelniającymi dostęp. Dodałem przykład użycia w odpowiedzi. Mam nadzieję że to pomoże. –

1

ta nie działa w przypadku wniosku Async.

Aktualizacja:

ignorowanie mój poprzedni komentarz. Działa po dodaniu do przechwytywania żądań asynchronicznych też:

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; 
       } 
      }; 
Powiązane problemy