提供来自Amazon S3的用户内容/图像

时间:2018-07-23 18:31:13

标签: amazon-web-services amazon-s3 architecture

我正在构建一个应用程序,允许用户上传图片并仅与他/她的朋友分享。

  1. 我正在使用spring restful服务将内容直接上传到s3。
  2. 使用OAuth对用户进行授权。
  3. 要上传图像,授权用户的js客户端会调用POST / images / {userid}
  4. 要下载图像,客户端必须调用GET / images / {userid} / {imageid}

每个用户的内容都以其自己的文件夹名称存储在s3中,第4点所述的下载服务是必须调用的服务。不幸的是,这意味着我不能将此URL作为源分配给图像标签<img src="">,因为授权令牌应在GET请求中发送。我不能公开用户文件夹的内容,因为只允许用户和他的朋友看到​​图像。当前的服务很快将成为瓶颈,我想避免这种情况。

解决此问题的推荐架构/设计是什么?

2 个答案:

答案 0 :(得分:2)

您应该拥有一个仅生成S3预签名URL的服务,而不是使用从S3加载并返回整个图像文件的服务。然后,可以在您网站的<img src="">标签中使用从该服务检索的URL。由于Web浏览器最终仍将直接从S3下载图像,同时仍然是安全的,因此性能将大大提高。

答案 1 :(得分:1)

下载图像的流程是这样的

用户调用GET请求下载图像

  • 在服务器端
    • 验证用户身份
    • 查询数据库中的元数据
    • 创建基于时间的身份验证令牌。
    • 创建图像URL(基于S3)并附加上一步中创建的身份验证令牌
  • 在客户端(用户浏览器)将用户重定向到新URL(此URL实际上是S3 location + auth令牌)
  • 现在直接请求将来自服务器(图像URL +身份验证令牌)
    • 验证令牌,然后向用户显示图片

上述URL长时间无效,但您的图片受到保护。由于身份验证令牌是基于时间的,因此它可以满足您的要求,就像有人将图像设为私有/公开删除朋友一样。删除的图像,复制图像URL的粘贴等..