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.

Самый простой способ получить заявления о требованиях политики -

  1. Редактировать пул
  2. Создать новую роль для пула удостоверений
  3. В IAM отредактируйте эту роль для копирования политик
  4. Добавьте эти доверительные отношения в вашу требуемую существующую роль

Другая, вероятно, менее распространенная причина: убедитесь, что вы действительно используете пул идентификаторов, а если нет, удалите идентификатор пула идентификаторов из файла aws-exports.js.

Я получал эту ошибку после добавления федеративного входа в мой пул пользователей (не пул удостоверений). По неизвестным причинам моя конфигурация включала aws_cognito_identity_pool_id. Удаление этого идентификатора решило ошибку для меня.

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

  • Провайдеры аутентификации
    • 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"
        }
      }
    }
  ]
}
Другие вопросы по тегам