AppSyn c Java аутентифицироваться с IAM - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь обновить свой клиент appsyn c для аутентификации с использованием учетных данных IAM. В случае API_KEY я устанавливаю API_KEY_HEADER следующим образом: request.addHeader(API_KEY_HEADER, this.apiKey); Есть ли аналогичный способ аутентификации в клиенте Java с учетными данными IAM? Есть ли заголовок, который я могу передать, чтобы передать секретные ключи и ключи доступа, как здесь: https://docs.amplify.aws/lib/graphqlapi/authz/q/platform/js#iam? Или я должен просто использовать пул пользователей когнитивного типа как способ аутентификации запроса?

1 Ответ

0 голосов
/ 22 июня 2020

Согласно документации AWS, нам необходимо использовать запросы подписи, используя процесс, описанный здесь: https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html и шаги, перечисленные здесь: https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html. Я также нашел здесь реализацию: https://medium.com/@tridibbolar / aws -lambda-as-an-appsyn c -client-fbb0c1ce927d . Используя приведенный выше код:

private void signRequest(final Request<AmazonWebServiceRequest> request) {
    final AWS4Signer signer = new AWS4Signer();
    signer.setRegionName(this.region);
    signer.setServiceName("appsync");
    signer.sign(request, this.appsyncCredentials);
}

private Request<AmazonWebServiceRequest> getRequest(final String data) {
    final Request<AmazonWebServiceRequest> request =
            new DefaultRequest<AmazonWebServiceRequest>("appsync");
    request.setHttpMethod(HttpMethodName.POST);
    request.setEndpoint(URI.create(this.appSyncEndpoint));
    final byte[] byteArray = data.getBytes(Charset.forName("UTF-8"));
    request.setContent(new ByteArrayInputStream(byteArray));
    request.addHeader(AUTH_TYPE_HEADER, AWS_IAM_AUTH_TYPE);
    request.addHeader(HttpHeaders.CONTENT_TYPE, APPLICATION_GRAPHQL);
    request.addHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(byteArray.length));
    signRequest(request);
    return request;
}

private HttpResponseHandler<String> getResponseHandler() {
    final HttpResponseHandler<String> responseHandler = new HttpResponseHandler<String>() {
        @Override
        public String handle(com.amazonaws.http.HttpResponse httpResponse) throws Exception {
            final String result = IOUtils.toString(httpResponse.getContent());
            if(httpResponse.getStatusCode() !=  HttpStatus.SC_OK) {
                final String errorText = String.format(
                                "Error posting request. Response status code was %s and text was %s. ",
                                httpResponse.getStatusCode(),
                                httpResponse.getStatusText());
                throw new RuntimeException(errorText);
            } else {
                final ObjectMapper objectMapper = new ObjectMapper();
                //custom class to parse appsync response.
                final AppsyncResponse response = objectMapper.readValue(result, AppsyncResponse.class);
                if(CollectionUtils.isNotEmpty(response.getErrors())){
                    final String errorMessages = response
                            .getErrors()
                            .stream()
                            .map(Error::getMessage)
                            .collect(Collectors.joining("\n"));
                    final String errorText = String.format(
                            "Error posting appsync request. Errors were %s. ",
                            errorMessages);
                    throw new RuntimeException(errorText);

                }
            }
            return result;
        }

        @Override
        public boolean needsConnectionLeftOpen() {
            return false;
        }
    };
    return responseHandler;
}

private Response<String> makeGraphQlRequest(final Request<AmazonWebServiceRequest> request) {
    return this.httpClient.requestExecutionBuilder()
            .executionContext(new ExecutionContext())
            .request(request)
            .execute(getResponseHandler());

}
...