Сгенерированные AWS Cognito учетные данные не принимаются API-шлюзом

У меня настроены конечные точки шлюза API с включенной авторизацией как IAM.

Сначала я попытался получить доступ к ресурсу, используя свои собственные учетные данные пользователя (ключ, секрет), и это сработало.

Затем я настроил Cognito с помощью пула удостоверений. Пул допускает как аутентифицированный, так и не аутентифицированный доступ.
Я сгенерировал учетные данные, используя PHP SDK:

$id = $cognitoClient->getId([
'AccountId' => 'xxx',
'IdentityPoolId' => 'xxx',
]);
$credentials = $cognitoClient->getCredentialsForIdentity([
'IdentityId' => $id->get('IdentityId')
])->get('Credentials');

Это может генерировать учетные данные — AccessKeyId, SecretKey а также SessionToken возвращаются.

Роль, которую я назначил с доступом без аутентификации, определяется следующим образом:

Доверительные отношения:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "cognito-identity.amazonaws.com"},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"cognito-identity.amazonaws.com:aud": "xxx"}
}
}
]
}

Действующие политики:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "cognito-sync:*",
"Resource": [
"arn:aws:cognito-sync:us-east-1:123456789012:identitypool/${cognito-identity.amazonaws.com:aud}/identity/${cognito-identity.amazonaws.com:sub}/*"]
}
]
}

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "cognito-sync:*",
"Resource": [
"arn:aws:cognito-sync:us-east-1:xxxxx:identitypool/*"]
}
]
}

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"apigateway:*"],
"Resource": [
"*"]
}
]
}

Я не прикрепил никакую управляемую политику к роли.

Теперь, после генерации учетных данных с использованием PHP SDK, я использую почтальон для доступа к ресурсу (я использовал почтальон, также используя кредиты моей учетной записи). Этот вызов выдает следующую ошибку:

{"message":"The security token included in the request is invalid."}

Я не могу определить, что здесь происходит не так.

3

Решение

На данный момент я перешел на использование Javascript SDK, который можно создавать для каждого развертывания.

Использование SDK решает проблему. Одна вещь, которую я заметил, состоит в том, что я должен передать токен сеанса в SDK, который я не передавал (я не знаю, куда его поместить) раньше.

3

Другие решения

TL; DR: чтобы он работал с Почтальоном, вы должны передать свой токен в заголовке X-Amz-Security-Token,

Во-первых, спасибо, я боролся с той же проблемой до вашего собственного ответа, который привел меня к решению.

В README javascript SDK вы можете найти:

var apigClient = apigClientFactory.newClient({
accessKey: 'ACCESS_KEY',
secretKey: 'SECRET_KEY',
sessionToken: 'SESSION_TOKEN', //OPTIONAL: If you are using temporary credentials you must include the session token
region: 'eu-west-1' // OPTIONAL: The region where the API is deployed, by default this parameter is set to us-east-1
});

Итак, вам нужен токен для временных учетных данных, было бы неплохо увидеть это в документе Cognito, а не здесь, но хорошо. Я отказываюсь писать тестовую версию javascript, для работы которой, очевидно, требуется CORS. На странице активации CORS у вас есть поле Access-Control-Allow-Headers со значением по умолчанию Content-Type, X-Amz-Date, Authorization, X-Api-Key, X-Amz-Security-Tokenи вот оно.

2