如何允许Cognito用户访问他们自己的S3文件夹

时间:2018-11-01 12:20:02

标签: amazon-web-services amazon-s3 boto3 amazon-cognito amazon-iam

我想要的是让aws cognito用户组(家族)对S3存储桶进行读写,而S3存储桶仅对这些用户家族可用。

我使用boto3 python库创建了一个用户。现在,我需要授予该用户访问其存储桶中文件夹的权限。

我发现了一些建议创建存储桶策略的帖子:

policy = {
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "Grant user access to his folder",
        "Effect": "Allow",
        "Principal": "*",
        "Action": ["s3:PutObject"],
        "Resource": "arn:aws:s3:::BUCKET/users/${cognito-identity.amazonaws.com:sub}",
        "Condition": {
            "StringLike": {
                "cognito-identity.amazonaws.com:sub": [
                    "us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
                    "us-east-1:yyyyyyyy-xxxx-xxxx-xxxx-xxxxxxxxxx"
                ]
            }
        }
    }
]}

但是事实证明,我们无法在存储桶的策略条件中指定“ cognito-identity.amazonaws.com:sub”。

我们非常感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

您应在用户池中创建,并将IAM角色分配给该组。

然后将用户添加到组中。

更多文档在这里:https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-user-groups.html

答案 1 :(得分:0)

我认为您具有的上述策略必须针对经过身份验证的用户使用IAM角色,而不是存储桶策略的一部分。

答案 2 :(得分:0)

您需要用户联合身份池以及cognito用户池。 联合身份池将具有两种IAM角色:经过身份验证的用户和未经身份验证的用户。您需要将此策略附加到经过身份验证的IAM角色。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::bucketname",

            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "${cognito-identity.amazonaws.com:sub}/*"
                    ]
                }
            }
        },
        {
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::bucketname/${cognito-identity.amazonaws.com:sub}/*",

            ]
        }
    ]
}

此策略将允许认知用户在存储桶“ bucketname”中写入/读取/删除到特定文件夹(文件夹名称为用户的identity_id)。

这是获取身份ID的方法。身份池ID是联合身份池的池ID。 id_token是用户通过cognito登录后将收到的令牌。

id_token = event["id_token"]
identity_pool_id = "ap-south-1:5dd90c82-c562-4a68-babf-6174fd8c03ef"
identity_client = boto3.client('cognito-identity')

try:
    identity_response = identity_client.get_id(IdentityPoolId=identity_pool_id, 
                                        Logins = {
                    PROVIDER: id_token
                    }
                    )
except Exception as e:
        return {"error": True, "success": False, "message": e.__str__(), "data": None}


identity_id = identity_response['IdentityId']