9

Sto provando a fare richieste HTTP a un dominio AWS Elasticsearch protetto da un criterio di accesso IAM. Ho bisogno di sign queste richieste affinché siano autorizzate da AWS. Sto usando Jest, che a sua volta usa Apache HttpComponents Client.Firma di richieste HTTP AWS con Apache HttpComponents Client

Questo sembra essere un caso di uso comune e mi chiedevo se esiste una libreria che posso utilizzare su Apache HttpComponents Client per firmare tutte le richieste.

risposta

10

Penso di averlo trovato! :)

Questo progetto sembra di fare esattamente quello che voglio: aws-signing-request-interceptor, descritto come "Richiesta Interceptor per Apache Cliente che sottoscrive la richiesta di AWS Originariamente creata per sostenere AWS' Servizio elasticsearch utilizzando il client Jest"..

Modifica: I forked the project per adattarsi alle mie esigenze (Java 7, credenziali STS temporanee) e funziona correttamente.

Ecco un esempio di utilizzo (qui senza STS credenziali temporanee):

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

Sì, funziona anche per me :) – panipsilos

+0

Hi Eric sto seguendo il link github fornito da voi. Siamo di fronte all'errore proibito. Un'altra domanda è nel client jest normale che passiamo all'endpoint di ricerca elastico. Ma qui stiamo passando solo il nome del servizio e la regione. Potete fornire codice di esempio o guida per risolvere il nostro problema. –

+0

Ciao @MohanShanmugam. L'errore vietato è probabilmente dovuto a errata configurazione delle policy di accesso o cattive credenziali. Ho aggiunto un esempio di utilizzo nella risposta. Spero che questo ti aiuti. –

1

Questo non funziona in caso di richiesta asincrona.

Aggiornamento:

Ignora il mio commento precedente. Funziona dopo l'aggiunta di intercettore per le richieste asincrone troppo:

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; 
       } 
      }; 
Problemi correlati