将 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 的 baseURIbasePathpath 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);