如何使用Cognito User Pools对DynamoDB细粒度访问控制?

abb*_*bbm 13 amazon-web-services amazon-dynamodb amazon-iam amazon-cognito

在使用Cognito用户池登录时,我无法理解如何在DynamoDB上使用细粒度访问控制.我跟着文档和谷歌搜索,但由于某种原因我似乎无法让它工作.

我的AWS设置如下所示.如果我删除角色策略中的条件,我可以获取并放置项目没有问题,所以似乎条件是问题.但我无法弄清楚如何或在何处调试依赖于经过身份验证的身份的策略 - 可用的变量,它们的值是什么等等.

任何帮助将不胜感激!

DynamoDB表

  • 表名:文件
  • 主分区键:userID(String)
  • 主要排序键:docID(String)

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

Cognito用户池用户

  • 用户状态:已启用/已确认
  • MFA状态:已禁用
  • sub:4fbf0c06-03a9-4cbe-b45c-ca4cd0f5f3cb
  • email_verified:true

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

从cognitoUser.getUserAttributes()返回的登录信息

attribute sub has value 4fbf0c06-03a9-4cbe-b45c-ca4cd0f5f3cb
attribute email_verified has value true
attribute email has value ****@****com
Run Code Online (Sandbox Code Playgroud)

错误信息

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

Che*_*hta 20

策略变量"${cognito-identity.amazonaws.com:sub}"不是您从Cognito用户池获得的用户子.事实上,当您将Cognito用户池中的用户与联合身份服务联合时,由Cognito Federated Identity服务生成的用户的身份ID.

因为,值"${cognito-identity.amazonaws.com:sub}"永远不会与DynamoDB行中的值相匹配,所以它与AccessDenied失败.为此,userIdDynamo条目中的实际应该是身份ID,而不是sub.目前,IAM策略变量与Cognito User Pools服务之间没有直接链接.

以下是一些可能有用的文档链接.
1. 使用Cognito联合身份服务的IAM角色
2. 将用户池与Cognito联合身份服务集成

  • 非常感谢你!对于需要更多指导的用户,当用户使用Cognito Identity Pools登录时,IAM中的字符串$ {cognito-identity.amazonaws.com:sub}将解析为`AWS.config.credentials中找到的值. identityId`(看起来像'us-east-1:######## - #### - #### - #### - ########### #`). (13认同)