Node.js 用于服务私有文件的AWS S3实现

Node.js 用于服务私有文件的AWS S3实现,node.js,amazon-web-services,amazon-s3,Node.js,Amazon Web Services,Amazon S3,用例:我们正在开发一个web应用程序,客户机要求我们使用AWS S3来存储图像。在应用程序中,每个人都有自己的帐户,并会上传自己的图片,一些上传的图片将是公开的 据我所知,我们可以通过使用预先签名的URL上传图像来实现这一点。但我面临的问题是,如何限制其他用户访问图像 如果您计划实施细粒度访问控制,有多种方法可以遵循。作为第一步,您需要为每个用户提供唯一的空间来上传内容。这可以是bucket或bucket中的路径前缀(您将其视为目录) 通常,我建议为每个用户使用路径前缀来划分用户空间,这将允许您

用例:我们正在开发一个web应用程序,客户机要求我们使用AWS S3来存储图像。在应用程序中,每个人都有自己的帐户,并会上传自己的图片,一些上传的图片将是公开的


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

如果您计划实施细粒度访问控制,有多种方法可以遵循。作为第一步,您需要为每个用户提供唯一的空间来上传内容。这可以是bucket或bucket中的路径前缀(您将其视为目录)


通常,我建议为每个用户使用路径前缀来划分用户空间,这将允许您使用IAM角色或创建具有所需细粒度访问控制的预签名URL,以便特定用户可以访问他们自己的空间。

您可以使用签名URL和签名cookie来提供私有内容。如果你不能更改应用程序,使用私人链接可能不可行,签名cookies可以帮助你。此外,CloudFront还提供了进一步的安全性和效率改进,请查看位于

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

  • 仅将其用作存储介质,仅由应用程序访问,或
  • 使用它直接向最终用户提供内容
在第一种情况下,只有您的应用程序可以访问存储在S3中的数据/文件。它必须检索内容并将其提供给用户。这是web服务器的传统方法

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

这可以通过使用预签名URL来增强,预签名URL是有时间限制的URL,提供对AmazonS3中存储的私有内容的访问。它的工作原理如下:

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

  • 请求对对象的引用
  • 与具有访问对象权限的IAM(标识和访问管理)实体关联的访问密钥——例如,您可以创建具有必要权限的IAM用户,然后向应用程序提供这些访问凭据
  • 一个到期时间戳,在该时间戳之前,预签名的URL是有效的
  • 加密计算的签名,用于验证预签名URL是否由拥有访问密钥的实体创建(有效地验证密码并散列上述信息)
预签名URL只需几行代码即可创建,无需调用AWSAPI


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

您应该为每个登录用户提供一个唯一的预签名URL,以便只有他们才能访问图像。