用于移动和Web访问的Cognito Role和AWS S3 Bucket策略

时间:2015-12-11 00:25:34

标签: amazon-web-services amazon-s3 amazon-cognito

我们的目标是创建S3存储桶和IAM角色策略,这些策略只允许对我们的登录用户进行S3访问。

我们在S3存储桶上托管私人文件,可以从网络和移动应用访问这些文件。我们正在尝试使用未经身份验证的角色为Amazon Cognito添加一层安全性,以便登录到我们应用程序的所有用户都可以访问S3存储桶。

使用AWS-SDK for JS并遵循基本的AWS.config.credentials设置,我们可以看到访问过的1个身份以及我们的Amazon Cognito Identity Dashboard中的同步数量。由于我们似乎正在连接到IdentityPool,因此我认为我们的策略可能需要进行一些调整,以便具有未经身份验证的Cognito角色的登录用户可以访问S3存储桶。

Cognito_IdentityPoolUnauth_Role的IAM角色政策

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "SID_NUMBER",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::OUR_BUCKET_NAME/*"
        ]
    }
  ]
}

S3 BUCKET POLICY

{
"Version": "2012-10-17",
"Id": "http referer policy example",
"Statement": [
    {
        "Sid": "",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::IAM_NUMBER:role/Cognito_IdentityPoolUnauth_Role"
        },
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::OUR_BUCKET_NAME/*"
    }
  ]
}

1 个答案:

答案 0 :(得分:3)

当您尝试直接从浏览器访问文件时,不会随请求一起发送凭据。它具有与尝试直接命中S3而没有任何代码从Cognito获取凭据相同的效果。要使用Cognito凭据,您需要使用javascript SDK发出请求。以下是使用从this page

获取的JavaScript SDK的示例请求
var s3 = new AWS.S3();
var params = {Bucket: 'myBucket', Key: 'myKey'};
s3.getSignedUrl('getObject', params, function (err, url) {
  console.log("The URL is", url);
});

如果您在获得Cognito凭据后调用此凭据,它将使用Cognito凭据创建已签名的URL以访问存储桶myBucket中的密钥myKey。您可以采用与此类似的方法对存储桶中的listObjects进行生成,然后生成已签名的URL(使用Cognito凭据签名),最终用户可以单击该URL以查看存储桶中每个密钥的内容。