Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将AWS签名头添加到所有rest assured请求_Java_Amazon Web Services_Aws Sdk_Rest Assured - Fatal编程技术网

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);