![](/img/trans.png)
[英]Apache HttpComponents: org.apache.http.client.ClientProtocolException
[英]Signing AWS HTTP requests with Apache HttpComponents Client
我正在嘗試向受 IAM 訪問策略保護的AWS Elasticsearch域發出 HTTP 請求。 我需要簽署這些請求,以便它們獲得 AWS 的授權。 我正在使用Jest ,而后者又使用Apache HttpComponents Client 。
這似乎是一個常見的用例,但我找不到我應該怎么做才能讓 Jest 簽署所有請求。
我想我找到了! :)
這個項目似乎完全符合我的要求: aws-signing-request-interceptor ,描述為“用於簽署 AWS 請求的 Apache 客戶端的請求攔截器。最初創建是為了使用 Jest 客戶端支持 AWS 的 Elasticsearch 服務。” .
編輯:我 分叉了該項目以滿足我的需求(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();
這在異步請求的情況下不起作用。
更新:
忽略我之前的評論。 它也可以在為異步請求添加攔截器后工作:
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;
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.