用于提供私有文件​​的 AWS S3 实现

rav*_*vis 4 amazon-s3 amazon-web-services node.js

用例:我们正在开发一个 Web 应用程序,并且客户端要求我们使用 AWS S3 来存储图像。在应用中,每个人都有自己的账号,上传自己的图片,部分上传的图片是公开的。

根据我的理解,我们可以通过使用预先标记的 URL 来上传图像来实现这一点。但我面临的问题是,如何限制其他用户访问图像。

Joh*_*ein 6

有两种使用 Amazon S3 的基本方法:

  • 将其纯粹用作存储介质,只能由您的应用程序访问,或者
  • 使用它直接向最终用户提供内容

在第一种情况下,只有您的应用程序可以访问存储在 S3 中的数据/文件。它必须检索内容并将其提供给用户。这是 Web 服务器的传统方法。

在第二种情况下,您可以生成包含对存储在 S3 中的文件的引用的 HTML 页面。例如,如果图像出现在网页中,则该src=参数将指向 Amazon S3 URL。然后从 S3 提供该文件,而无需通过您的 Web 服务器。

这可以通过使用预签名 URL 来增强,这些 URL 是有时间限制的 URL,提供对存储在 Amazon S3 中的私有内容的访问。它是这样工作的:

  • 文件存储在 S3 中并保密(意味着不允许访问)
  • 您的应用程序完全负责确定哪些用户可以访问哪些文件
  • 当应用程序希望授予用户访问权限时(例如,他们可能想查看自己的照片),它会生成一个预签名 URL 并将其包含在 HTML 页面中
  • 当用户的 Web 浏览器使用预签名 URL 访问内容时
  • Amazon S3 接收请求,验证预签名 URL 上的签名和时间戳,如果获得批准,则提供文件以响应请求

预签名 URL 包括:

  • 对所请求对象的引用
  • 与有权访问对象的 IAM(身份和访问管理)实体关联的访问密钥——例如,您可以创建一个具有必要权限的 IAM 用户,然后将这些访问凭证提供给您的应用程序
  • 预签名 URL 有效之前的到期时间戳
  • 一个加密计算的签名,用于验证预签名 URL 是由拥有访问密钥的实体创建的(实际上,它验证密码并对上述信息进行哈希处理)

预签名 URL 只需几行代码即可创建,不需要调用 AWS API。

底线:将所有图像保密。您的应用程序确认每个用户即时访问图像的权利,然后生成 URL 以授予限时访问权限。