如何使用Amazon S3创建一次性下载链接?

Mug*_*les 14 php jquery http amazon-s3 amazon-web-services

我想创建一个亚马逊s3托管文件的一次性下载链接.文件下载后,此链接将过期.

我希望仍然托管此文件,但访问者只能下载文件一次.

我需要这个场景是:我有一个文件下载网站,用户在那里支付文件费用.我希望用户只能从网站(和亚马逊s3)下载文件一次,我也不希望用户能够与其他人共享直接下载链接.

如果这是不可能的,我想知道如果可能的话,用IP地址或Cookie来限制它是否更有效?

Cha*_*lke 19

没有办法告诉S3允许链接只使用一次.但是您可以创建一个只能在指定时间之前使用的链接.我所做的是将请求者重定向到几分钟内到期的S3链接,因此他或她没有时间分享它.只要浏览器有时间接收重定向响应并遵循它,您就可以将到期时间设置得非常短,甚至几秒钟.

  • 对于您的情况,甚至比更通用的createPresignedUrl方法更好的是getObjectUrl方法:http://docs.aws.amazon.com/aws-sdk-php/latest/class-Aws.S3.S3Client.html#_getObjectUrl.$ s3-> getObjectUrl('bucket-name','object-key','+ 5分钟'); (5认同)
  • 这听起来适合我的情况,有没有关于如何解决这个问题的信息? (2认同)
  • @CharlesEngelke,你说得对,`CloudFront在HTTP请求时检查签名URL中的过期日期和时间.如果客户端在到期时间之前立即开始下载大型对象,则即使在下载过程中经过了到期时间,下载也应该完成.如果TCP连接中断并且客户端在过期时间后尝试重新启动下载,则下载将失败.来自http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-signed- urls-overview.html同样适用于S3 (2认同)

okw*_*wap 7

您可以编写“一次性 url 生成器”服务(以网站或休息 API 的形式)并利用 aws 联合用户功能来实现这一点。

考虑以下过程:

  • 当用户需要一次性网址时,他们会将请求发送到您的“一次性网址生成器”服务。
  • 您的服务会生成一个“一次性 url”并将其返回给用户。url 是到用户想要的 S3 资源的一对一映射。
  • 当用户向“一次性 url”发出请求时,该服务会使用 AWS 联合用户功能创建一个临时用户,并代表临时用户生成一个 S3 预签名 url。
  • 该服务将响应发送回用户,重定向到预先签名的 url。
  • 用户遵循重定向,并开始下载文件。
  • 该服务然后删除临时用户。(或者让它过期。)