AWS S3 - 存储和提供非私有图片

3
我第一次使用Flysystem实现S3文件上传(在这种情况下是用户个人资料头像图像)。我目前已经创建了一个S3存储桶,用户可以上传图像,然后在存储桶控制台上在线查看。现在我需要在请求时显示这些图像(即查看该用户的个人资料)。我认为这个过程是生成URL(例如https://s3.my-region.amazonaws.com/my-bucket/my-filename.jpeg)并将其用作图像标记的src,但是要做到这一点,文件(或存储桶)必须被标记为公共的。这对我来说似乎是合理的,因为其中的文件并不真正是私有的。然而,当更新存储桶为公共状态时,您会收到一条消息,指出:

我们强烈建议您永远不要向S3存储桶授予任何公共访问权限。

是否有其他更安全的方法来实现像这样的直接图像链接,新手无法看到?

您上传文件的代码可以指定特定文件对所有人只读访问权限。在PHP SDK中,这是ACL =>'public-read'。 - Dave S
请参见 https://flysystem.thephpleague.com/api/ 中的“管理可见性” - 您还可以使用读取流并代理它和/或缓存它,所有这些都在文档链接中。 - Lawrence Cherone
2个回答

7
警告的原因是因为很多人无意中会把信息公开。不过,如果你希望这些特定文件随时可以被互联网上的任何人访问,那么你可以将单个对象设为公开或创建一个 Amazon S3 存储桶策略来使特定路径公开。

另一种授权访问的方法是创建一个S3 预签名 URL,它是一个有时间限制的 URL,可以授权访问私人对象。
你的应用程序需要负责验证用户是否应该被授权访问特定对象。然后,它会生成 URL,提供访问持续时间。你的应用程序可以将 URL 插入到 src 字段中,图片将正常显示。但是,一旦时间限制到期,它就无法再被访问了。
通常在提供对私人文件的访问权限时使用此方法,类似于 DropBox 如何在不公开文件本身的情况下给出私人文件的访问权限。

0
我建议将CloudFront放在静态资源的前面(无意冒犯),这样它就可以在所有数据中心中提供服务,而不仅仅是您上传的区域,并且我认为这样会更便宜,因为它不会使用来自您的S3存储桶的带宽。这样,您可以授予CloudFront对您的S3存储桶的权限,而无需手动在存储桶中设置文件为公共访问。请搜索如何为CloudFront和S3设置IAM用户以进行设置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接