21

我正在使用 AWS Javascript API 并尝试获取分配的 cognito 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": [
        "*"
    ]
}]
}
4

10 回答 10

44

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

有关 Amazon Cognito 中信任关系的更多信息,请参阅我们的开发人员指南

于 2015-05-25T07:10:39.340 回答
29

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

唯一正确提及的文档是这个

错误的:

也许我错过了一些东西,但这肯定令人困惑。

于 2015-10-14T02:49:04.903 回答
8

检查分配给您的身份池的角色的“信任关系”部分,即身份验证用户。确保您具有定义对 Cognito 池的访问权限的策略。

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

  1. 编辑池
  2. 为身份池创建新角色
  3. 在 IAM 中编辑此角色以复制策略语句
  4. 将这些信任关系添加到您所需的现有角色
于 2017-02-09T22:12:35.213 回答
2

另一个 - 可能不太常见 - 原因:确保您实际使用的是身份池,如果没有,请从 aws-exports.js 中删除身份池 ID。

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

于 2020-09-04T14:55:45.177 回答
1

我为我的身份池多次检查了为“已验证角色”和“未验证角色”配置的角色的信任关系,但仍然出现错误。在查看了我的整个身份池配置后,我意识到在

  • 身份验证提供程序
    • 认知
      • 认证角色选择

我选择了“从令牌中选择角色”,而我错误配置的角色是我为我的用户附加到 cognito 组的角色。所以更新这个角色的信任关系解决了这个问题。

希望这可以帮助某人:)

于 2018-05-31T07:21:50.327 回答
1

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

于 2019-07-16T02:20:34.127 回答
0

遇到这个问题,经过几个小时检查我们的问题可能是什么,发现信任策略实际上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"
        }
      }
    }
  ]
}
于 2022-01-18T02:06:09.457 回答
0

另一种不太可能的情况是,您使用的提供者或身份池是无效的。我花了几个小时在我的代码中调试一个丢失的 ENV。

于 2021-08-20T12:36:59.283 回答
0

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

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

于 2021-03-03T16:35:07.630 回答
0

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

于 2018-08-29T13:23:47.747 回答