我正在开发一个android应用程序,在“通过”cognito访问s3 bucket时一直遇到问题。
我正设法使用池中特定用户的用户名和密码连接到Cognoto池:
AWSMobileClient auth = AWSMobileClient.getInstance();
auth.signIn("username", "password", new HashMap<String, String>());
if (auth.isSignedIn()) {
ActivityUtils.startActivity(this, MyActivity.class);
}
我在池中的用户被分配到具有attach s3角色的组:
Role ARN arn:aws:iam::<my account number>:role/Cognito_S3_Full_Access
其中包含这些权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
]
}
当我试图使用“amazons3client”时,我使用“awsmobileclient”中的凭据创建的“amazons3client”会不断出错。我是这样创造的:
AWSMobileClient awsMobileClient =AWSMobileClient.getInstance();
AmazonS3Client s3Client = new AmazonS3Client(awsMobileClient);
我得到的错误是:
2019-05-20 17:56:21.645 27019-27019/com.mycomp.mypackage E/S3Uploader: Error upload file to S3 bucket : Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: 375C07384A904483)
当我使用硬编码的accesskey和secretkey创建“amazons3client”时,我创建了一个新的“i a m”用户并附加了与上面相同的策略,它可以正常工作。
我是这样用的:
BasicAWSCredentials credentials = new BasicAWSCredentials("myAccessKey_hsjgfhjsdg", "mySecretKey_asdhasjkdha");
AmazonS3Client s3Client = new AmazonS3Client(credentials);
但是我不想用硬编码的密码填充我的应用程序,特别是我已经通过用户输入他的用户名和密码来连接了
一些注意事项:当我尝试在使用cognoto登录后获取密钥和访问密钥时,我可以看到每次登录都会获得不同的令牌,所以我想这部分是有效的。
所以我的问题是我做错了什么?
如何使“amazons3client”使用登录用户及其分配的组的会话和角色权限?
最佳答案
我已正确设置了所有内容,并获得了相同的拒绝访问权限(服务:amazon s3;状态代码:403;错误代码:access denied;请求ID:8d650e2cccd58e34)
我错过了S3模板中的条件:
"Condition": {
"StringLike": {
"s3:prefix": [
"public/",
"public/*",
"protected/",
"protected/*",
"private/${cognito-identity.amazonaws.com:sub}/",
"private/${cognito-identity.amazonaws.com:sub}/*"
]
}
}
基本上,根据策略的不同,密钥必须以这些前缀开头。我对放大文档中的public/s3key.txt示例密钥没什么印象。
private val transferUtility = TransferUtility.builder()
.context(context)
.s3Client(AmazonS3Client(AWSMobileClient.getInstance(), Region.getRegion(Regions.EU_WEST_1)))
.awsConfiguration(AWSMobileClient.getInstance().configuration) // use the generated s3 template
.build()
transferUtility.upload("public/$key/${file.name}", file)