【问题标题】:AWS Cognito Invalid identity pool configurationAWS Cognito 无效的身份池配置
【发布时间】:2015-08-06 04:51:52
【问题描述】:

我正在使用 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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

          • 首先我将 RoleArn 放在 CognitoIdentityCredentials() 中,然后再进一步。然后我意识到信任关系中的认知身份id不正确。我不知道错误的 id 是怎么进来的。
          • 两天!我花了两天时间弄明白了!只需要更新池 ID:|谢谢!!
          • 检查了ID是否正确但还是一样的错误:(
          • 链接已失效。
          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                【解决方案8】:

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

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

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

                希望这可以帮助某人:)

                【讨论】:

                • 我使用了您的选项(“从令牌中选择角色”),但最后对我有用的是选项:“使用默认角色”
                【解决方案9】:

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

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

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

                【讨论】:

                  【解决方案10】:

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

                  错误的:

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

                  【讨论】:

                  • 你是我的上帝
                  • 我认为没有必要。正如 Bob 在另一个答案中提到的,您可以为您的 IAM 角色设置信任关系。我不小心导致AWS.config.credentials.get 上的InvalidIdentityPoolConfigurationException 发生,原因是我重新创建了我的身份池并忘记更新 cognito 身份验证的 IAM 角色的信任关系。
                  • 另外,我不喜欢将我的 AWS 账户 ID 和角色信息暴露在 js 中的公共网站上。
                  • 确实@ing0 已修复:(
                  • @koxon 我实际上是在谈论在您的 javascript 实现中公开这些细节,但也将它们从 SO 中删除可能是个好主意!
                  猜你喜欢
                  • 2019-10-31
                  • 2020-06-08
                  • 1970-01-01
                  • 2016-08-27
                  • 2018-08-31
                  • 2017-10-27
                  • 1970-01-01
                  • 2017-10-18
                  • 2021-06-08
                  相关资源
                  最近更新 更多