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 池的访问权限的策略。
获取需求政策声明的最简单方法是,
- 编辑池
- 为身份池创建新角色
- 在 IAM 中编辑此角色以复制策略声明
- 将这些信任关系添加到您所需的现有角色中
我不止一次检查了为我的身份池配置的 "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"
}
}
}
]
}
我正在使用 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 池的访问权限的策略。
获取需求政策声明的最简单方法是,
- 编辑池
- 为身份池创建新角色
- 在 IAM 中编辑此角色以复制策略声明
- 将这些信任关系添加到您所需的现有角色中
我不止一次检查了为我的身份池配置的 "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"
}
}
}
]
}