Cognito用户池无法访问S3的策略失败

时间:2018-10-16 21:31:30

标签: android amazon-web-services amazon-s3 amazon-cognito aws-userpools

我有一个Cognito用户池,该池需要访问带有基于UserId(${cognito-identity.amazonaws.com:sub})的前缀的S3存储桶。我已经使用以下内联策略在IAM中为用户池设置了角色,该内联策略是从IAM组的现有类似策略中复制和编辑的:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::[Bucket Having Problems]"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::[Unrelated Bucket]/${cognito-identity.amazonaws.com:sub}/*"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::[Bucket Having Problems]/${cognito-identity.amazonaws.com:sub}/*"
        }
    ]
}

“信任关系”标签具有

Trusted entities: cognito-identity.amazonaws.com

Conditions: StringEquals, cognito-identity.amazonaws.com:aud, [Pool ID of User Pool I want to use]

当我尝试在所需的存储桶中ListObjects中使用

作为前缀

[Cognito User Id]/[optional: Subfolder, with or without trailing "/"]

上的getObject

[Cognito User Id]/[File I know is there]

我遇到一个403: Access Denied错误(或者有时是一个错误,该错误不允许未经身份验证的访问,之后我需要再次输入用户名和密码)。

我已经确认${cognito-identity.amazonaws.com:sub}上的UserId(CognitoUserPool.getCurrentUser)与我登录的Cognito用户相同(尽管中间有一个CognitoCachingCredentialsProvider,拥有与之关联的其他IdentityId

我不知道我的政策是否得到正确应用;我认为我已经把所有东西都捆绑在一起了,但是Access Advisor表示在跟踪期内尚未对其进行访问。我在远程做正确的事吗?有什么明显的我想念的东西吗?我可以收集有关该问题的任何mroe数据吗?例外总是有一个请求ID和一个S3扩展请求ID,但是Google似乎建议我只能直接与AWS技术支持联系来使用它。

如何根据唯一标识Cognito用户的信息授予Cognito用户从S3存储桶读取的权限?

更新:我修改了策略以允许GetObject访问所有内容,但我仍在获取AccessDenied:

    {
        "Sid": "VisualEditor2",
        "Effect": "Allow",
        "Action": "s3:GetObject",
        "Resource": "*"
    }

我认为问题在于根本没有使用该政策,我也不知道为什么。

更新:我想我需要提出一个使用角色的请求。现在想办法。

更新:尝试扮演以下角色:

AssumeRoleRequest roleRequest = new AssumeRoleRequest().withRoleArn([ARN for Role]).withRoleSessionName([I made up a name for this]);
AssumeRoleResult result = new AWSSecurityTokenServiceClient(cognitocachingprovider.getCredentials()).assumeRole(roleRequest);
AmazonS3Client client = new AmazonS3Client(new BasicAWSCredentials(result.getCredentials().getAccessKeyId(), result.getCredentials().getSecretAccessKey()));
S3Object obj = client.getObject(bucket, pathOfKnownObject);

我得到403:assumeRole(roleRequest)上的访问被拒绝

0 个答案:

没有答案