是的,预签名的URL应该适合你。只是提供快速说明...
默认情况下,Amazon S3中的所有对象都是私有的。然后,您可以添加权限,以便人们可以访问您的对象。这可以通过以下方式进行:
- 对单个对象
- 水桶策略的访问控制列表的权限(即授权基于路径,IP地址,引荐等范围广泛的访问)
- IAM用户和组(即权限授予与AWS凭证用户)
- 前置签名网址
甲Pre-Signed URL可用于授予访问S3 OBJE cts作为“覆盖”访问控制的一种方式。通常可以通过URL访问一个通常为私人对象的,并附上失效时间和签名。这是在不需要Web服务器的情况下提供私人内容的好方法。
如果你的目标是服务内容只有在使用预签名URL,然后:
- 不分配通过上面列出的常规方法的任何权限(这让他们的私人默认)
- 使用前签署的网址访问对象
你的代码是:
const getLinkForKey = key => new Promise((resolve, reject) => {
const params = {Bucket: PICTURES_BUCKET, Key: key};
S3.getSignedUrl('getObject', params, (err, url) => err && reject(err) || resolve(url));
});
我注意到你是未通过Expires
参数,它指定了预先签名的URL的有效期。下面是从Amazon S3 documentation for node.js一个代码示例:
var params = {Bucket: 'bucket', Key: 'key', Expires: 60};
var url = s3.getSignedUrl('getObject', params);
console.log('The URL is', url); // expires in 60 seconds
因此,很可能你测试的URL之前链接过期。我建议您提供一个Expires
参数并将其设置为适合您预期用途的长度(例如300秒)。
在存储区权限中,允许'Everyone'能够列出/查看文件。 – hjpotter92
如果我这样做,每个人都可以访问thoses的照片,不是吗?我想提供具体的链接给他们访问特定的图片 – Ereold
如果你知道他们的IP,你可以创建一个策略。 – hjpotter92