使用 Cognito 用户池登录时,我无法理解如何在 DynamoDB 上使用细粒度访问控制。我已经按照文档进行了搜索,但由于某种原因,我似乎无法使其正常工作。
下面列出了我的 AWS 设置。如果我删除角色策略中的条件,我可以毫无问题地获取和放置项目,因此条件似乎是问题所在。但我无法弄清楚如何或在哪里调试依赖于经过身份验证的身份的策略 - 哪些变量可用,它们的值是什么等等。
任何帮助将不胜感激!
DynamoDB 表
DynamoDB 示例行
{
"attributes": {},
"docID": "0f332745-f749-4b1a-b26d-4593959e9847",
"lastModifiedNumeric": 1470175027561,
"lastModifiedText": "Wed Aug 03 2016 07:57:07 GMT+1000 (AEST)",
"type": "documents",
"userID": "4fbf0c06-03a9-4cbe-b45c-ca4cd0f5f3cb"
}
Cognito 用户池用户
“RoleName”的角色策略
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:PutItem"
],
"Resource": [
"arn:aws:dynamodb:ap-southeast-2:NUMBER:table/documents"
],
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": [
"${cognito-identity.amazonaws.com:sub}"
]
}
}
}
]
}
从 cognitoUser.getUserAttributes() 返回的登录信息
attribute sub has value 4fbf0c06-03a9-4cbe-b45c-ca4cd0f5f3cb
attribute email_verified has value true
attribute email has value ****@****com
错误信息
Code: "AccessDeniedException"
Message: User: arn:aws:sts::NUMBER:assumed-role/ROLE_NAME/CognitoIdentityCredentials is not authorized to perform: dynamodb:GetItem on resource: arn:aws:dynamodb:ap-southeast-2:NUMBER:table/documents
最佳答案
策略变量 "${cognito-identity.amazonaws.com:sub}"
不是您从 Cognito 用户池中获得的用户子。实际上,当您将 Cognito 用户池中的用户与联合身份服务联合时,由 Cognito 联合身份服务生成的用户身份 ID。
因为,"${cognito-identity.amazonaws.com:sub}"
中的值永远不会匹配您在 DynamoDB 行中拥有的内容,它会因 AccessDenied 而失败。为此,userId
在您的 Dynamo 条目中实际上应该是身份 ID,而不是 sub。目前,IAM 策略变量与 Cognito 用户池服务之间没有直接联系。
这里有一些可能有帮助的文档链接。
1. IAM roles with Cognito Federated Identity Service
2. Integrating User Pools with Cognito Federated Identity Service
关于amazon-web-services - 如何将 DynamoDB 细粒度访问控制与 Cognito 用户池结合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38731723/