将 AWS 签名 Header 添加到所有放心请求
Add AWS Signature Header to all rest assured requests
我正在尝试通过 rest-assured
调用托管在 aws api gateway
中的 get api
我可以签署请求并拨打电话。但是要签署请求,我需要将完整的 url 传递给 AWS 以生成授权 Header.
例如。如果我要访问一个端点
https://my-aws-api.com/basepath/v1/request/123
我需要通过 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);
如果我这样做,那么我就不能使用 RestAssured 的 baseURI
、basePath
和 path params
我想访问它
RestAssured.baseURI="https://my-aws-api.com";
RestAssured.basePath="basepath/v1";
given()
.log().ifValidationFails()
.pathParam("reqID", "123")
.when()
.get("request/{reqID}")
.then()
.log().ifValidationFails()
.statusCode(200);
AwsSigner
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();
}
所以我的问题是有什么办法,我可以在调用之前拦截 RestAssured 的请求,这样我就可以获得完全生成的端点并将 aws 签名 header 添加到调用中。
我不熟悉这个库,但通过简单阅读它的文档和 Javadoc,您应该能够使用 RequestFilter 在发送请求之前检查和更改请求。
查看用户指南的 Filter 部分。
感谢@Ashaman。
Filter 部分正是我要查找的内容
您可以从 RequestSpec 获取随请求一起传递的 uri 和其他 headers,然后将其发送到函数以对其进行签名并删除旧的 headers 并放入新的 headers.然后转发请求
@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);
});
}
并且对于测试我可以正常使用 Rest Assured 的功能
given()
.log().ifValidationFails()
.pathParam("reqID", "123")
.when()
.get("request/{reqID}")
.then()
.log().ifValidationFails()
.statusCode(200);
我正在尝试通过 rest-assured
aws api gateway
中的 get api
我可以签署请求并拨打电话。但是要签署请求,我需要将完整的 url 传递给 AWS 以生成授权 Header.
例如。如果我要访问一个端点
https://my-aws-api.com/basepath/v1/request/123
我需要通过 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);
如果我这样做,那么我就不能使用 RestAssured 的 baseURI
、basePath
和 path params
我想访问它
RestAssured.baseURI="https://my-aws-api.com";
RestAssured.basePath="basepath/v1";
given()
.log().ifValidationFails()
.pathParam("reqID", "123")
.when()
.get("request/{reqID}")
.then()
.log().ifValidationFails()
.statusCode(200);
AwsSigner
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();
}
所以我的问题是有什么办法,我可以在调用之前拦截 RestAssured 的请求,这样我就可以获得完全生成的端点并将 aws 签名 header 添加到调用中。
我不熟悉这个库,但通过简单阅读它的文档和 Javadoc,您应该能够使用 RequestFilter 在发送请求之前检查和更改请求。
查看用户指南的 Filter 部分。
感谢@Ashaman。
Filter 部分正是我要查找的内容
您可以从 RequestSpec 获取随请求一起传递的 uri 和其他 headers,然后将其发送到函数以对其进行签名并删除旧的 headers 并放入新的 headers.然后转发请求
@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);
});
}
并且对于测试我可以正常使用 Rest Assured 的功能
given()
.log().ifValidationFails()
.pathParam("reqID", "123")
.when()
.get("request/{reqID}")
.then()
.log().ifValidationFails()
.statusCode(200);