Добавьте заголовок подписи AWS ко всем гарантированным запросам - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь вызвать get api, который находится в aws api gateway через rest-assured

Я могу подписать запрос и сделать звонок. Но чтобы подписать запрос, мне нужно передать полный URL-адрес в AWS, чтобы сгенерировать заголовок авторизации.

Например. Если я собираюсь получить доступ к конечной точке 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 к вызову.

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Я не знаком с этой библиотекой, но после краткого прочтения ее документации и Javadoc, вы сможете использовать RequestFilter для проверки и изменения запроса перед его отправкой.

Ознакомьтесь с разделом Фильтр в руководстве пользователя.

0 голосов
/ 23 октября 2019

Благодаря @ Ashaman.

Секция Filter - это то, что я ищу

Вы можете получить uri и другие заголовки, которые были переданы с запросами от RequestSpec, а затем отправить его в функциюподписать их и удалить старые заголовки и поставить новые заголовки. Затем перешлите запрос

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

И для тестов я могу нормально пользоваться функциями Ass Assured

given()
        .log().ifValidationFails()
        .pathParam("reqID", "123")
.when()
        .get("request/{reqID}")
.then()
        .log().ifValidationFails()
        .statusCode(200);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...