AWS Cognito无效的标识池配置

drf*_*nce 16 amazon-web-services amazon-javascript-sdk amazon-cognito

我正在使用AWS Javascript API并尝试获取指定的cognito id:

AWS.config.credentials.get(function(err) {
    if (!err) {
        console.log("Cognito Identity Id: " + AWS.config.credentials.identityId);
    }
});
Run Code Online (Sandbox Code Playgroud)

为什么这会导致下面的消息出现400错误?

{"__type":"InvalidIdentityPoolConfigurationException","message":"Invalid identity pool configuration. Check assigned IAM roles for this pool."}
Run Code Online (Sandbox Code Playgroud)

我为经过身份验证和未经身份验证的用户配置了IAM角色.

{
"Version": "2012-10-17",
"Statement": [{
    "Action": [
        "mobileanalytics:PutEvents",
        "cognito-sync:*"
    ],
    "Effect": "Allow",
    "Resource": [
        "*"
    ]
}]
}
Run Code Online (Sandbox Code Playgroud)

Bob*_*ney 38

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

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

  • 这绝对是正确的答案. (2认同)

kox*_*xon 23

经过一番挖掘后,我意识到您必须将RoleArn和AccountId添加到您的凭据中.

即使大多数文档都提到这个就足够了:

AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: 'us-east-1:xxxxx-a87e-46ed-9519-xxxxxxx',
});
Run Code Online (Sandbox Code Playgroud)

这还不够.

我不得不这样做:

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
});
Run Code Online (Sandbox Code Playgroud)

您必须为您的身份池提及您的角色的ARN.

唯一提到它的医生就是这个.

错误的:

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

  • 你是我的神 (5认同)
  • 我不认为这是必要的.正如Bob在另一个答案中提到的,您可以为您的IAM角色设置信任关系.我不小心导致`AWS.config.credentials.get`上的`InvalidIdentityPoolConfigurationException`通过重新创建我的身份池并忘记更新cognito认证的IAM角色的信任关系而发生. (3认同)
  • 另外,我不喜欢在js的公共网站上公开我的AWS账户ID和角色信息的想法. (2认同)
  • @koxon我实际上是在讨论在你的javascript实现中暴露这些细节,但是从SO中删除它们也是一个好主意! (2认同)

Jer*_*ony 8

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

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

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