【问题标题】:Add AWS Signature Header to all rest assured requests将 AWS 签名标头添加到所有放心请求
【发布时间】:2019-10-21 14:26:52
【问题描述】:

我正在尝试通过rest-assured 调用托管在aws api gateway 中的get api

我可以签署请求并拨打电话。但是要签署请求,我需要将完整的 url 传递给 AWS 以生成 Authorization 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 签名的标头添加到调用中。

【问题讨论】:

  • 您找到解决方案了吗?

标签: java amazon-web-services aws-sdk rest-assured


【解决方案1】:

我不熟悉这个库,但是通过简要阅读它的文档和 Javadoc,您应该能够使用 RequestFilter 在发送请求之前检查和更改请求。

查看用户指南的Filter 部分。

【讨论】:

    【解决方案2】:

    感谢@Ashaman。

    Filter 部分是我正在寻找的部分

    您可以从 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);
        });
    }
    

    对于测试我可以正常使用放心的功能

    given()
            .log().ifValidationFails()
            .pathParam("reqID", "123")
    .when()
            .get("request/{reqID}")
    .then()
            .log().ifValidationFails()
            .statusCode(200);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-25
      • 1970-01-01
      • 2020-04-18
      • 2012-12-01
      • 2017-02-15
      相关资源
      最近更新 更多