如何从IAM策略变量中的Cognito用户池访问自定义属性?

kev*_*x91 6 amazon-web-services amazon-dynamodb amazon-cognito aws-cognito

我有一个Cognito用户池,其中包含分配给组的用户。

每个组都有其自己的角色,该角色在登录时(通过联合身份验证的用户)分配。这部分效果很好。

因此,可以创建不同的访问级别和组来匹配这些情况。我正在使用DynamoDB来存储一些与用户和组织相关的数据。每个角色都可以微调。

出现问题的地方是需要有多个租户。我已经添加了一个自定义属性,并根据上面讨论的角色限制了对编辑和更新此属性的访问权限。对于DynamoDB,在IAM策略中,我可以基于硬编码的组织ID(可以将其附加到每个项目)来限制对行的访问。

像这样“ rd”是组织ID的硬编码值:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": [
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:PutItem",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem"
        ],
        "Resource": [
            "arn:aws:dynamodb:{region}:{number}:table/*"
        ],
        "Condition": {
            "ForAnyValue:StringEquals": {
                "dynamodb:LeadingKeys": [
                    "rd"
                ]
            }
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

}

但是,我希望能够访问与已登录用户相关的属性(不是他们的唯一ID,而是他们可以与组织中的其他人共有的东西),以避免硬编码。像这样:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": [
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:PutItem",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem"
        ],
        "Resource": [
            "arn:aws:dynamodb:{regions}:{number}:table/*"
        ],
        "Condition": {
            "ForAnyValue:StringEquals": {
                "dynamodb:LeadingKeys": [
                    "${cognito-idp.{region}.amazonaws.com/{poolID}:attr[custom:org_id]}"
                ]
            }
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

}

我得到的错误是:

AccessDeniedException: User: arn:aws:sts::{number}:assumed-role/{role_name}/CognitoIdentityCredentials is not authorized to perform: dynamodb:GetItem on resource: arn:aws:dynamodb:{region}:{number}:table/{table_name}
Run Code Online (Sandbox Code Playgroud)

我已经测试了它的不同配置,到目前为止,通过反复试验,硬编码方法已经奏效,但是所有类型的变量都失败了。如果有更好的方法来实现多租户,请随时提出建议。但是,如果我可以直接从用户池访问变量,那就太好了。

有谁知道这是如何实现的(我已经阅读了很多文档并已经尝试了很多组合方法)?

另外:“ dynamodb:Query”似乎不想接受“ dynamodb:LeadingKeys”,但是文档似乎另有说明,因此我从本示例中将其删除。

我正在使用aws-sdk + cognito-identity-js进行身份验证并发出请求,该代码可正常工作并在放宽权限时返回数据。