AWS Cognito 身份池配置无效

问题描述 投票:0回答:11

我正在使用 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": [
        "*"
    ]
}]
}
amazon-web-services amazon-cognito amazon-javascript-sdk
11个回答
46
投票

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

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


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。

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

错误的:

也许我遗漏了一些东西,但这确实令人困惑。


8
投票

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

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

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

2
投票

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

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

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

希望这对某人有帮助:)


2
投票

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

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


1
投票

就我而言,我使用的是 SAML 身份提供商。 IAM 角色策略中的操作应为:

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


0
投票

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


0
投票

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

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


0
投票

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


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"
        }
      }
    }
  ]
}

0
投票

由于角色信任策略的“操作”字段配置错误,我遇到了同样的错误。我使用的是“sts:AssumeRole”而不是“sts:AssumeRoleWithWebIdentity”。如果您使用 cognito 自托管 UI 来获取令牌,则必须使用后一种。

检查AWS Security Token Service API 参考 - 操作以查看您的信任策略中是否有正确的“操作”。

© www.soinside.com 2019 - 2024. All rights reserved.