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

时间:2016-08-02 22:54:13

标签: amazon-web-services amazon-dynamodb amazon-iam amazon-cognito

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

我的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"
}

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}"
                    ]
                }
            }
        }
    ]
}

从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

1 个答案:

答案 0 :(得分:19)

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

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

以下是一些可能有用的文档链接 1. IAM roles with Cognito Federated Identity Service
2. Integrating User Pools with Cognito Federated Identity Service