Java 将AWS签名头添加到所有rest assured请求
我正试图通过Java 将AWS签名头添加到所有rest assured请求,java,amazon-web-services,aws-sdk,rest-assured,Java,Amazon Web Services,Aws Sdk,Rest Assured,我正试图通过rest-assured调用托管在aws-api网关中的get-api 我可以在请求上签名并打电话。但是为了签署请求,我需要将完整的url传递给AWS以生成授权头 例如,如果我要访问一个端点 https://my-aws-api.com/basepath/v1/request/123 我需要通过AWSSigner对请求进行签名,而AWSSigner需要完整的端点来完成签名 我目前的做法 String baseURI="https://my-aws-api.com"; String
rest-assured
调用托管在aws-api网关中的get-api
我可以在请求上签名并打电话。但是为了签署请求,我需要将完整的url传递给AWS以生成授权头
例如,如果我要访问一个端点
https://my-aws-api.com/basepath/v1/request/123
我需要通过AWSSigner对请求进行签名,而AWSSigner需要完整的端点来完成签名
我目前的做法
String baseURI="https://my-aws-api.com";
String basePath="basepath/v1";
String requestPath="request/123";
String endpoint=baseURI+"/"+basePath+"/"+requestPath;
Map<String,String> signedHeaders= aws4sign(endpoint,defaultHeaders);
given()
.log().ifValidationFails()
.headers(signedHeaders)
.when()
.get(endpoint)
.then()
.log().ifValidationFails()
.statusCode(200);
阿西涅
public static Map<String, String> aws4Sign(String endpoint, Map<String, String> headers) throws URISyntaxException {
String serviceName = "execute-api";
AWS4Signer aws4Signer = new AWS4Signer();
aws4Signer.setRegionName(EU_WEST_1.getName());
aws4Signer.setServiceName(serviceName);
DefaultRequest defaultRequest = new DefaultRequest(serviceName);
URI uri = new URI(endpoint);
defaultRequest.setEndpoint(new URI(uri.getScheme(), null, uri.getHost(), uri.getPort(), "", "", ""));
defaultRequest.setHttpMethod(HttpMethodName.GET);
defaultRequest.setResourcePath(uri.getRawPath());
defaultRequest.setHeaders(headers);
aws4Signer.sign(defaultRequest, DefaultAWSCredentialsProviderChain.getInstance().getCredentials());
return defaultRequest.getHeaders();
}
publicstaticmap aws4Sign(字符串端点、映射头)抛出URISyntaxException{
字符串serviceName=“执行api”;
AWS4Signer AWS4Signer=新的AWS4Signer();
aws4Signer.setRegionName(EU_WEST_1.getName());
aws4Signer.setServiceName(服务名称);
DefaultRequest DefaultRequest=新的DefaultRequest(serviceName);
URI=新URI(端点);
defaultRequest.setEndpoint(新URI(URI.getScheme(),null,URI.getHost(),URI.getPort(),“”,“”,“”);
defaultRequest.setHttpMethod(HttpMethodName.GET);
defaultRequest.setResourcePath(uri.getRawPath());
defaultRequest.setHeaders(headers);
aws4Signer.sign(defaultRequest,DefaultAWSCredentialsProviderChain.getInstance().getCredentials());
返回defaultRequest.getHeaders();
}
所以我的问题是,我可以在重启请求发出之前拦截它,这样我就可以得到完全生成的端点,并将aws签名头添加到调用中。我不熟悉这个库,但通过简单阅读它的文档和Javadoc,您应该能够使用RequestFilter在发出请求之前检查和更改请求
请查看用户指南的部分。感谢@Ashaman
这个部分就是我要找的
您可以从RequestSpec获取uri和其他与请求一起传递的头,然后将其发送给函数对其进行签名,删除旧头并放置新头。然后转发请求
@BeforeAll
public void init() {
RestAssured.baseURI = "https://my-aws-api.com";
RestAssured.filters((requestSpec, responseSpec, ctx) -> {
Map<String, String> headers = requestSpec.getHeaders()
.asList()
.stream()
.collect(Collectors.toMap(Header::getName, Header::getValue));
Map<String, String> signedHeaders = aws4sign(requestSpec.getURI(), headers);
requestSpec.removeHeaders();
requestSpec.headers(signedHeaders);
return ctx.next(requestSpec, responseSpec);
});
}
你找到解决办法了吗?
@BeforeAll
public void init() {
RestAssured.baseURI = "https://my-aws-api.com";
RestAssured.filters((requestSpec, responseSpec, ctx) -> {
Map<String, String> headers = requestSpec.getHeaders()
.asList()
.stream()
.collect(Collectors.toMap(Header::getName, Header::getValue));
Map<String, String> signedHeaders = aws4sign(requestSpec.getURI(), headers);
requestSpec.removeHeaders();
requestSpec.headers(signedHeaders);
return ctx.next(requestSpec, responseSpec);
});
}
given()
.log().ifValidationFails()
.pathParam("reqID", "123")
.when()
.get("request/{reqID}")
.then()
.log().ifValidationFails()
.statusCode(200);