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


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

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

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

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


4855
2017-10-19 15:03


起源

我建议您在自托管网站上托管您的文件,并使用像php这样的服务器端脚本语言来处理下载


答案:


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


13
2017-10-19 16:33



这听起来适合我的任何关于如何解决这个问题的信息? - Muggles
我看到你正在使用PHP。我没有编程,但亚马逊有一个SDK,看起来你应该使用createPresignedUrl方法。它记录在 docs.aws.amazon.com/aws-sdk-php-2/latest/... - Charles Engelke
因此,您的网页将包含指向您网站上的网址的链接。点击该网址会导致您的网站向您刚创建的预签名网址发送重定向回复,并在一分钟左右过期。 - Charles Engelke
对于您的情况,getObjectUrl方法甚至比更通用的createPresignedUrl方法更好: docs.aws.amazon.com/aws-sdk-php/latest/...。 $ s3-> getObjectUrl('bucket-name','object-key','+ 5分钟'); - Jeremy Lindblom
@CharlesEngelke,你没事, CloudFront checks the expiration date and time in a signed URL at the time of the HTTP request. If a client begins to download a large object immediately before the expiration time, the download should complete even if the expiration time passes during the download. If the TCP connection drops and the client tries to restart the download after the expiration time passes, the download will fail. 从 docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/...  同样适用于S3 - sha256


您可以编写“一次性URL生成器”服务(以网站或其他API的形式)并使用aws联合用户功能来实现此目的。

请考虑以下过程:

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

3
2017-07-20 12:52



任何开源项目都有这个功能吗? - Stef Heyenrath
@Stef试试这个: github.com/joshpangell/single-use - Avi Parshan
@AviParshan有没有类似的Java库? - sinu
@sinu我不知道 - Avi Parshan


http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateCFSignatureCodeAndExamples.html

使用签名的URL。只有此用户才能使用此URL。它还依赖于AWS​​ SDK


0
2018-06-30 03:17



请提供链接中的内容摘要。 - gaganso
请提供更多信息,然后在答案中提供一个链接。虽然无论出于何种原因链接脱机都可能有效,但整个答案都变得毫无用处。 - Charlie Fish