繁体   English   中英

AWS Cognito在Android上访问S3的权限

[英]AWS Cognito permissions to access S3 on Android

我正在开发一个Android应用程序并且一直在访问S3“斗争”Cognito时遇到问题。 我正在设置连接到我的认知池,使用我池中特定用户的用户名和密码:

AWSMobileClient auth = AWSMobileClient.getInstance();
auth.signIn("username", "password", new HashMap<String, String>());
if (auth.isSignedIn()) {
        ActivityUtils.startActivity(this, MyActivity.class);
}

我在池中的用户被分配到具有附加S3角色的组:

Role ARN    arn:aws:iam::<my account number>:role/Cognito_S3_Full_Access

其中包含这些权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "*"
        }
    ]
}

当我尝试使用我使用“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)

当我使用我创建的新“IAM”用户的HARD-CODED accessKey和secretKey创建“AmazonS3Client”并附加与上面相同的策略时,它按预期工作。 我这样使用它:

BasicAWSCredentials credentials = new BasicAWSCredentials("myAccessKey_hsjgfhjsdg", "mySecretKey_asdhasjkdha");
AmazonS3Client s3Client = new AmazonS3Client(credentials);

但我不想用硬编码密码填满我的应用程序,特别是我已经设法使用用户输入的用户名和密码进行连接

  • 一些注意事项:当我在使用Cognito登录后尝试获取密钥和访问密钥时,我可以看到每次登录时都会获得不同的令牌,所以我猜这部分工作正常。

所以我的问题是我做错了什么?

如何让“AmazonS3Client”使用登录用户及其分配的组的会话和角色权限?

我已经正确设置了一切并获得相同的拒绝访问权限(服务:Amazon S3;状态代码:403;错误代码:AccessDenied;请求ID:8D650E2CCCD58E34)

我错过的是S3模板中的条件:

"Condition": {
    "StringLike": {
        "s3:prefix": [
            "public/",
            "public/*",
            "protected/",
            "protected/*",
            "private/${cognito-identity.amazonaws.com:sub}/",
            "private/${cognito-identity.amazonaws.com:sub}/*"
        ]
    }
}

基本上,您的密钥必须从这些前缀开始,具体取决于策略。 我对Amplify文档中的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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM