我想在S3中存储用户的个人资料图像,并将其显示在客户端 – 将S3对象展示给移动客户端的最佳做法是什么?

所以我有一个Android聊天应用程序,用户可以创build个人资料照片。 这些照片被发送到我的节点JS后端,我上传到我的AWS S3存储桶。 我将关键字存储在我的SQL数据库下的“ user ”表中的“ image_path ”列中。

现在,当用户访问应用中的多个其他用户的聊天室时,他们应该能够看到其他用户的个人资料照片。 目前,在join聊天室时,所有用户及其“ image_path ”列表被返回给客户端。 我正在考虑如何以有效的方式向用户展示个人资料图片,而不会违反最佳安全做法。

我正在考虑的第一个解决scheme如下:

  1. 使S3桶读取公共
  2. 客户端现在可以通过“ bucket-name.s3.amazonaws.com/image_path ”请求直接访问其他用户的个人资料图片。

我对这个方法的担心是S3显示下面的警告,这让我觉得这种方法有些严重的错误:

 You have provided public access to this bucket. We highly recommend that you never grant any kind of public access to your S3 bucket. 

我正在考虑的第二个解决scheme是:

  1. 当在聊天室中检索用户时,遍历每个用户,从每个用户的“ image_path ”创build一个预先签名的URL,在X时间后过期,然后将其返回给客户端

我看到了一些问题。 首先,如果用户在聊天室中停留的时间长于预先签名的url的到期时间,该怎么办? 实现这个刷新逻辑听起来像头痛。 而且,生成所有预先签名的URL似乎会在后端花费很长时间。

推荐哪两种方法? 还有其他的select我应该考虑吗?

更新:所以目前我正在诉诸第一个方法,它工作正常 – 但是,仍然想知道最佳实践是什么。 我想到了另外一种方法,那就是将AWS凭证保护在我的客户端中,然后使用这些凭证来检索用户对象,同时使该桶保持私有状态。 但是,这引入了存储额外的凭证客户端,这增加了安全问题的问题,但我想知道这是否也是一个可行的select。