AWS Cognito Неверная конфигурация пула идентификаторов

Я использую API JavaScript 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": [
        "*"
    ]
}]
}

Ответ 1

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

Более подробную информацию о доверительных отношениях в Amazon Cognito можно найти в нашем руководстве разработчика.

Ответ 2

После некоторого копания я понял, что вы должны добавить 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 своей роли для своего пула идентификаторов.

Единственный документ, который упоминает это правильно, этот.

Неправильные:

Возможно, я что-то пропустил, но это, конечно, запутывает.

Ответ 3

Проверьте раздел "Доверительные отношения" роли, назначенной вашему пулу идентификаторов, пользователям аутентификации. Убедитесь, что у вас есть политики, определяющие доступ к вашему пулу Cognito.

Самый простой способ получить инструкции политики требований:

  • Изменить пул
  • Создать новую роль для пула идентификаторов
  • В IAM отредактируйте эту роль, чтобы скопировать инструкции политики
  • Добавьте эти доверительные отношения в требуемую существующую роль.

Ответ 4

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

  • Провайдеры аутентификации
    • Cognito
      • Аутентифицированный выбор ролей

Я выбрал "Выбрать роль из токена", и моя неправильно настроенная роль была той, которую я прикрепил к группе Cognito для моих пользователей. Таким образом, обновление Доверительных отношений для этой роли устранило проблему.

Надеюсь, это поможет кому-то :)

Ответ 5

Я столкнулся с этой ошибкой, и моя проблема оказалась в том, что мой пользователь играл роль, не прошедшую проверку подлинности, потому что я возвращал AWSTask (result: nil) из функции logins() в моем собственном CognitoDeveloperIdentityProvider.

Ответ 6

В моем случае я использую провайдера идентификации SAML. Действие в политике ролей IAM должно быть следующим: "Action": "sts:AssumeRoleWithSAML". Но это коренная причина исключения. Я должен вручную изменить его на "Action": "sts:AssumeRoleWithWebIdentity". Оказывается, любая роль, созданная пулом идентификации Cognito, будет использовать "Action": "sts:AssumeRoleWithWebIdentity". Он не будет проверять ваш тип провайдера идентификации. Я считаю, что это ошибка.