我们的目标是创建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/*"
}
]
}
答案 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以查看存储桶中每个密钥的内容。