Вызов AWS API Gateway с помощью AWS Cognito

Мы используем механизм подписи AWS V4 для вызовов конечной точки API Gateway из нашего приложения для iOS. Мы встроили идентификатор ключа доступа и секретный ключ в код, который работал нормально. Очевидно, что это небезопасный способ, и рекомендуется использовать AWS Cognito. Я хотел знать, как мы используем временный ключ доступа и секрет (и, возможно, ключ сеанса), которые мы получаем из объекта AWSCredentials в моем коде iOS на Objective-C, для выполнения безопасных запросов к нашей конечной точке шлюза API.

Мы попытались использовать временный ключ доступа и секрет, полученные от Cognito, для создания подписи V4 вместо ключа доступа и секрета учетной записи, но это не кажется правильным подходом. Метод шлюза API включен с AWS_IAM в качестве параметра авторизации.

Это ошибка, которую мы получаем:

{ status code: 403, headers {
    Connection = "keep-alive";
    "Content-Length" = 69;
    "Content-Type" = "application/json";
    Date = "Fri, 13 Jan 2017 10:26:38 GMT";
    Via = "1.1 .....cloudfront.net (CloudFront)";
    "X-Amz-Cf-Id" = "...";
    "X-Cache" = "Error from cloudfront";
    "x-amzn-ErrorType" = UnrecognizedClientException;
    "x-amzn-RequestId" = "...";
} }

Используемый IdentityPoolId взят из пула удостоверений, созданного для федеративных удостоверений в AWS Cognito.

AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1 identityPoolId:@"us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"];

Мы используем неаутентифицированную роль, поскольку нам не нужна какая-либо форма аутентификации пользователя. И эта роль имеет следующие политики: AmazonAPIGatewayInvokeFullAccess AmazonAPIGatewayPushToCloudWatchLogs CloudFrontFullAccess AmazonCognitoDeveloperAuthenticatedIdentities AmazonAPIGatewayAdministrator CloudFrontOnlyReadOnlyAccess IAMReadOnlyAccess AmazonCognitoPowerUser

Не могли бы вы помочь здесь, как я могу использовать Cognito для создания подписей V4 или полностью обойти этот процесс.


person Abhi    schedule 13.01.2017    source источник
comment
Зарегистрировали ли вы конфигурацию, использующую поставщика учетных данных?   -  person donkon    schedule 13.01.2017


Ответы (2)


Похоже, вы получаете UnrecognizedClientException в качестве ответа, но шлюз API не возвращает UnrecognizedClientException. У вас есть идентификатор запроса, который получил ошибку?

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

AWSCognitoCredentialsProvider *creds = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1 identityPoolId:your_cognito_pool_id];

AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:creds];

AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = configuration;

Я думаю, что для вашей политики ролей без проверки подлинности вы предоставляете слишком мощное разрешение не прошедшим проверку подлинности пользователям. если вы хотите, чтобы они могли вызывать ваш API, вы можете просто предоставить им AmazonAPIGatewayInvokeFullAccess или даже ограничиться уровнем метода.

person Ka Hou Ieong    schedule 13.01.2017

Отправка HTTP-заголовка «x-amz-security-token» со значением переменной sessionKey, полученной из объекта AWSCredentials, решила проблему:

[request setValue:sessionToken forHTTPHeaderField:@"X-Amz-Security-Token"];

Объект AWSCredentials извлекается с использованием:

[[credentialsProvider credentials] continueWithBlock:^id(AWSTask<AWSCredentials *> *task) {
        if (task.error) {
            DDLogCError(@"failed getting credentials: %@", task.error);
        }
        else {
            AWSCredentials *credentials = task.result;
        }
        return nil;
    }]

И да, урезали политики до одной — AmazonAPIGatewayInvokeFullAccess. Спасибо за ваш отзыв.

person Abhi    schedule 13.01.2017