2016-10-28 164 views
0

我对AWS非常陌生,并且试图允许用户使用预先签名的URL访问/上载S3上的某些图片。使用预签名URL在Amazon S3上获取或放置对象

这里是我的代码:

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)); 
 
});

我收到从一个URL,但是当我尝试访问我收到的链接,我得到一个拒绝访问异常。

我想我可能需要配置一些桶策略或类似的东西,但我对这个问题非常困惑。

你知道如何使这项工作?

谢谢,

+0

在存储区权限中,允许'Everyone'能够列出/查看文件。 – hjpotter92

+0

如果我这样做,每个人都可以访问thoses的照片,不是吗?我想提供具体的链接给他们访问特定的图片 – Ereold

+0

如果你知道他们的IP,你可以创建一个策略。 – hjpotter92

回答

1

是的,预签名的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秒)。

+0

在文档上,据说默认情况下,Expires设置为15分钟。我仍然尝试手动设置它,结果是一样的,拒绝访问: -/ – Ereold

+1

检查您是否没有其他策略会覆盖安全性(尽管我不确定这适用于预先签名的URL )。例如:桶策略应该可能为空,签名用户的IAM权限不应该有DENY。您还可以通过[AWS命令行界面(CLI)](http://aws.amazon.com/cli/)['aws s3 presign'命令](http:// docs.aws.amazon.com/cli/latest/reference/s3/presign.html)。 –

+0

是否有可能我们可以从控制台生成这些预定网址 –

0

我终于找出问题所在。我正在执行我的代码到一个没有正确访问S3配置的lambda中。不幸的是,没有任何错误可以帮助我找到它。它现在是固定的,并且链接工作:)

相关问题