AWS Cognito 身份池配置无效

AWS Cognito Invalid identity pool configuration

我正在使用 AWS Javascript API 并尝试获取分配的认知 ID:

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": [
        "*"
    ]
}]
}

此错误的最常见原因是您的角色未设置为信任您的身份池。您应该确认您的信任关系中列出的身份池 ID 与您正在使用的身份池匹配。

有关 Amazon Cognito 中信任关系的更多信息,请参阅我们的 developer guide

经过一番挖掘,我意识到您必须将 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。

唯一正确提及的文档是 this one

错误的:

也许我遗漏了什么,但这确实令人困惑。

检查分配给身份池身份验证用户的角色的 "Trust Relationship" 部分。 确保您有定义对 Cognito 池的访问权限的策略。

获取需求政策声明的最简单方法是,

  1. 编辑池
  2. 为身份池创建新角色
  3. 在 IAM 中编辑此角色以复制策略声明
  4. 将这些信任关系添加到您所需的现有角色中

我不止一次检查了为我的身份池配置的 "Authenticated role" 和 "Unauthenticated role" 角色的信任关系,但仍然出现错误。 在检查了我的整个身份池配置后,我认识到

  • 身份验证提供商
    • 认知
      • 经过身份验证的角色选择

我选择了 "Choose role from token",但我错误配置的角色是我为我的用户附加到 cognito 组的角色。 因此更新此角色的信任关系解决了问题。

希望这对某人有所帮助:)

我遇到了这个错误,我的问题原来是我的用户假设了一个未经身份验证的角色,因为我从我的自定义 CognitoDeveloperIdentityProvider 中的 logins() 函数返回 AWSTask(result:nil)。

就我而言,我使用的是 SAML 身份提供商。 IAM 角色策略中的操作应为:"Action": "sts:AssumeRoleWithSAML"。但这是异常的根本原因。我必须手动将其更改为 "Action": "sts:AssumeRoleWithWebIdentity"。事实证明,Cognito 身份池创建的任何角色都将使用 "Action": "sts:AssumeRoleWithWebIdentity"。它不会检查您的身份提供者类型。我认为这是一个错误。

另一个 - 可能不太常见 - 原因:确保你确实在使用身份池,如果没有,请从你的 aws-exports.js.

中删除身份池 ID

我在将联合登录添加到我的用户池(而非身份池)后收到此错误。出于未知原因,我的配置包含一个 aws_cognito_identity_pool_id。删除此 ID 为我解决了错误。

我在尝试通过我的身份池用户从 S3 检索文件时遇到了同样的错误。

解决方案:您可以在 IAM 中为“Web Identity”创建一个角色。然后提供您的身份池 ID 并添加您希望该角色拥有的权限,例如S3 完全访问。然后导航回 Amazon Cognito 身份池并将您刚刚创建的角色分配给 unauthrole 或 authrole。身份池中的用户现在应该能够访问 S3 资源

另一种不太可能发生的情况是您使用的提供者或 identityPoolId 无效。我花了几个小时调试我的代码中缺少的 ENV。

遇到这个问题,经过几个小时检查我们的问题可能是什么,发现信任策略实际上在操作列表中缺少这一行 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"
        }
      }
    }
  ]
}