使用 Apache HttpComponents Client 对 AWS HTTP 请求进行签名
2022-09-04 20:52:30
我正在尝试向受 IAM 访问策略保护的 AWS Elasticsearch 域发出 HTTP 请求。我需要对这些请求进行签名,以便它们获得 AWS 的授权。我正在使用Jest,它又使用Apache HttpComponents Client。
这似乎是一个常见的用例,但我找不到我应该做什么,以便Jest可以签署所有请求。
我正在尝试向受 IAM 访问策略保护的 AWS Elasticsearch 域发出 HTTP 请求。我需要对这些请求进行签名,以便它们获得 AWS 的授权。我正在使用Jest,它又使用Apache HttpComponents Client。
这似乎是一个常见的用例,但我找不到我应该做什么,以便Jest可以签署所有请求。
我想我找到了!:)
这个项目似乎完全符合我想要的:aws-signing-request-interceptor,被描述为“Apache Client的请求拦截器,它为AWS的请求签名。最初创建是为了支持使用 Jest 客户端的 AWS 弹性搜索服务。
编辑:我分叉了项目以满足我的需求(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;
}
};