我正在尝试向HTTP发出HTTP请求 AWS Elasticsearch 受IAM访问策略保护的域。我需要 标志 这些请求由AWS授权。 我在用着 笑话,反过来使用 Apache HttpComponents客户端。
这似乎是一个常见的用例,我想知道是否有某种类型的库,我可以在Apache HttpComponents客户端上使用它来签署所有请求。
我正在尝试向HTTP发出HTTP请求 AWS Elasticsearch 受IAM访问策略保护的域。我需要 标志 这些请求由AWS授权。 我在用着 笑话,反过来使用 Apache HttpComponents客户端。
这似乎是一个常见的用例,我想知道是否有某种类型的库,我可以在Apache HttpComponents客户端上使用它来签署所有请求。
我想我找到了! :)
这个项目似乎完全符合我的要求: AWS签名请求拦截, 被形容为 “请求用于签署AWS请求的Apache Client的拦截器。最初是为了使用Jest客户端支持AWS的Elasticsearch Service而创建的。”。
编辑:我 分叉项目 为了满足我的需求(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();
我想我找到了! :)
这个项目似乎完全符合我的要求: AWS签名请求拦截, 被形容为 “请求用于签署AWS请求的Apache Client的拦截器。最初是为了使用Jest客户端支持AWS的Elasticsearch Service而创建的。”。
编辑:我 分叉项目 为了满足我的需求(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();
这在Async请求的情况下不起作用。
更新:
忽略我以前的评论。它也在为异步请求添加拦截器之后工作:
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;
}
};