node.js - 用于提供私有(private)文件​​的 AWS S3 实现

标签 node.js amazon-web-services amazon-s3

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

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

最佳答案

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

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

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

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

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

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

预签名 URL 包括:

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

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

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

关于node.js - 用于提供私有(private)文件​​的 AWS S3 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47237134/

相关文章:

javascript - 如何将我的 Node Express 应用程序限制为仅本地主机?

node.js - 套接字方法的瓶颈?

amazon-ec2 - (EC2) 'AMI: Unavailable' 是什么意思以及我应该如何处理它?

amazon-s3 - 如何在 kubernetes 的 Fluentd-kubernetes-daemonset 中添加多个输出

node.js - kafka 消费者组在 kafka-node 中获取重复消息

node.js - 当用户点击 pwa、Angular 6 和 Node.JS 中的 web-push 中的通知时路由到 url

amazon-web-services - 亚马逊 S3 : Use aws s3 cp without downloading existing files?

ruby-on-rails - Elastic beanstalk Rails - 即使我设置了暂存环境,也默认为生产环境

amazon-web-services - CloudFront + S3网站: "The specified key does not exist" when an implicit index document should be displayed

bash - 从 Amazon S3 存储桶下载文件的脚本