我想将文件托管在私有AWS S3存储桶中,该文件只能由经过我的Web应用程序身份验证的用户访问。这些文件下载的链接必须是静态的。
简单的代理方法:
我知道可以使用代理服务来完成。在这种情况下,静态链接将指向该服务,并且该服务将处理验证请求用户的会话,如果有效,该服务将使用来自S3的文件内容进行响应。
预签名的URL代理方法:
但是,我想知道是否可以以某种方式使用预签名的URL,而不是实现代理来控制对文件的访问?
https://docs.aws.amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURL.html
在这种情况下,代理的作用是向用户返回一个预签名的URL,而不是从S3返回文件的实际有效负载。然后,最终用户可以使用此预签名URL直接从S3下载文件。我尚不清楚的是如何在浏览器中管理此流程,我假设我需要将JavaScript编写为以下内容:
我在这里吗?
答案 0 :(得分:3)
仅将307重定向从您的服务器返回到预先签名的URL。例如。客户要求:
GET /the/file HTTP/1.1
然后服务器生成一个预签名的URL并响应:
HTTP/1.1 307 Temporary Redirect
Location: https://s3.aws..../the/file?...
答案 1 :(得分:1)
这是一种有效的方法。
当心凭据过期。在用于签名的URL到期或它们的到期时间(由您控制,在限制范围内)发生之前,签名的URL在较短的时间内会比较有用。如果您已经在使用临时凭证(这非常好!),则可能需要显式使用AssumeRole来控制到期时间(您可以从角色中假设一个角色,以使用新的时间限制获取新的临时凭证) 。
还有另一个选择:Amazon Cognito。这样可以弥合用户帐户之间的鸿沟,然后直接向用户的浏览器环境颁发每用户的短期凭据。然后,他们可以使用自己的凭据对S3进行API调用。这有一些好处(您可以更好地在他们的个人资料中表达用户权限,而不是在他们生成URL之前亲自检查他们)和一些复杂性(我可以使用我的用户凭据来对您的帐户进行操作,还是可以控制我可以调用的API?当IAM是您唯一的身份验证层时,特权确实很重要。)另一方面,IAM呼叫是免费的,您无需为托管它们的服务器付费,因此,如果您使用联盟身份(用户池),那么这听起来很划算。许多。