我正在开发一个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)

07-24 09:39