我有一个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)
上的访问被拒绝