AWS Cognito Неправильная конфигурация пула удостоверений
Я использую API-интерфейс AWS Javascript и пытаюсь получить назначенный идентификатор Cognito:
AWS.config.credentials.get(function(err) {
if (!err) {
console.log("Cognito Identity Id: " + AWS.config.credentials.identityId);
}
});
Почему это приводит к ошибке 400 с сообщением ниже?
{"__type":"InvalidIdentityPoolConfigurationException","message":"Invalid identity pool configuration. Check assigned IAM roles for this pool."}
У меня есть роли IAM, настроенные для аутентифицированных и не аутентифицированных пользователей.
{
"Version": "2012-10-17",
"Statement": [{
"Action": [
"mobileanalytics:PutEvents",
"cognito-sync:*"
],
"Effect": "Allow",
"Resource": [
"*"
]
}]
}
10 ответов
Наиболее распространенной причиной этой ошибки является то, что ваши роли не настроены на доверие к пулу удостоверений. Вы должны подтвердить, что идентификатор пула идентификаторов, указанный в ваших доверительных отношениях, совпадает с тем, который вы используете.
Более подробную информацию о доверительных отношениях в Amazon Cognito можно найти в нашем руководстве для разработчиков.
После некоторых копаний я понял, что вы должны добавить RoleArn и AccountId к своим учетным данным.
Несмотря на то, что большая часть документации там упоминает, что этого достаточно:
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: 'us-east-1:xxxxx-a87e-46ed-9519-xxxxxxx',
});
Этого было недостаточно.
Я должен был сделать это:
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: 'us-east-1:xxxxx-a87e-46ed-9519-xxxxx',
RoleArn: 'arn:aws:iam::xxxxx:role/Cognito_xxxxUsersUnauth_Role',
AccountId: 'xxxxxxxxx', // your AWS account ID
});
Вы должны упомянуть ARN вашей роли для вашего удостоверения личности.
Единственный документ, который упоминает это правильно, это этот.
Неправильные:
Может быть, я что-то упускаю, но это, безусловно, сбивает с толку.
Проверьте раздел "Доверительные отношения" роли, которая назначена вашему пулу удостоверений, пользователям аутентификации. Убедитесь, что у вас есть политики, определяющие доступ к вашему пулу Cognito.
Самый простой способ получить заявления о требованиях политики -
- Редактировать пул
- Создать новую роль для пула удостоверений
- В IAM отредактируйте эту роль для копирования политик
- Добавьте эти доверительные отношения в вашу требуемую существующую роль
Другая, вероятно, менее распространенная причина: убедитесь, что вы действительно используете пул идентификаторов, а если нет, удалите идентификатор пула идентификаторов из файла aws-exports.js.
Я получал эту ошибку после добавления федеративного входа в мой пул пользователей (не пул удостоверений). По неизвестным причинам моя конфигурация включала aws_cognito_identity_pool_id. Удаление этого идентификатора решило ошибку для меня.
Я проверял доверительные отношения своих ролей, настроенных для "Роли с проверкой подлинности" и "Роли без проверки подлинности", для моего пула удостоверений несколько раз, но ошибка все же произошла. Изучив всю конфигурацию пула идентификаторов, я понял, что в
- Провайдеры аутентификации
- Cognito
- Аутентифицированный выбор ролей
- Cognito
Я выбрал "Выбрать роль из токена", и моя неправильно настроенная роль была той, которую я прикрепил к группе Cognito для моих пользователей. Обновление доверительных отношений для этой роли устранило проблему.
Надеюсь, это поможет кому-то:)
В моем случае я использую провайдера идентификации SAML. Действие в политике ролей IAM должно быть: "Action": "sts:AssumeRoleWithSAML"
, Но это коренная причина исключения. Я должен вручную изменить его на "Action": "sts:AssumeRoleWithWebIdentity"
, Оказывается, любая роль, созданная пулом идентификации Cognito, будет использовать "Action": "sts:AssumeRoleWithWebIdentity"
, Он не будет проверять ваш тип провайдера идентификации. Я считаю, что это ошибка.
Я столкнулся с этой ошибкой, и моя проблема оказалась в том, что мой пользователь играл роль, не прошедшую проверку подлинности, потому что я возвращал AWSTask(result:nil) из функции logins() в моем собственном CognitoDeveloperIdentityProvider.
Другой, менее вероятный сценарий, заключается в том, что используемый вами поставщик или identityPoolId недействителен. Я часами отлаживал недостающий ENV в своем коде.
У меня была такая же ошибка при попытке получить файлы с S3 через пользователей моего пула удостоверений.
Решение: вы можете создать роль в IAM для «Web Identity». Затем укажите свой идентификатор пула идентификаторов и добавьте разрешения, которые должна иметь роль, например S3FullAccess. Затем вернитесь к пулам Amazon Cognito Identity и назначьте только что созданную роль роли unauthrole или authrole. Теперь пользователи в пуле удостоверений должны иметь доступ к ресурсам S3.
Если бы эта проблема возникла после нескольких часов проверки того, в чем может быть проблема, мы обнаружили, что в политике доверия на самом деле отсутствует эта строка.
sts:TagSession
в списке действий, поэтому в конечном итоге политика доверия с проверкой подлинности будет такой, как определено ниже:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "cognito-identity.amazonaws.com"
},
"Action": [
"sts:AssumeRoleWithWebIdentity",
**"sts:TagSession"** //this does the trick for me
],
"Condition": {
"StringEquals": {
"cognito-identity.amazonaws.com:aud": "{IDENTITY_POOL_ID}"
},
"ForAnyValue:StringLike": {
"cognito-identity.amazonaws.com:amr": "authenticated"
}
}
}
]
}