如何允许数据库中的用户仅从s3存储桶下载其图像?

时间:2019-04-08 09:45:52

标签: android amazon-web-services amazon-s3 flask amazon-cloudfront

我正在使用flask作为REST API的后端。我有一个数据库,其中包含用户和他们上传的图像信息。所有图像都存储在S3存储桶中,例如“ bucket_name / user_1 / img1.jpg” 。我想允许用户下载所有仅针对他们的图像,即文件夹“ user_1” 中的内容,并且他们不应该访问“ user_2” 图像。此外,存储桶及其内容是私有的。

图像表具有图像路径(例如“ bucket_name / user_1 / img1.jpg”),只能由flask应用访问。 REST API由Android应用程序使用。

因此,当Android应用程序上的用户获取其图像(使用GET请求)时,他应该能够下载所有图像。如何传递这些图像?

  • 使用AWS Cloudfront和OAI
  • 使用boto3烧瓶–generate_presigned_url()
  • 公开存储桶内容(我绝对不想要)

这个android-flask-AWS Flow应该如何工作?

1 个答案:

答案 0 :(得分:0)

有两种方法可以实现这一目标。

  1. 您可以使用预签名的URL,或者
  2. 提供允许访问其文件夹的临时凭据。

预签名URL

保留所有内容私有。然后,当客户端(例如Android应用程序)需要访问对象时,您的应用程序应通过检查数据库来验证他们有权访问该对象。如果允许访问,则应用程序应生成一个预签名URL ,该URL授予对对象的时间限制访问。

创建预签名URL仅需要几行代码,而无需调用AWS。因此,创建起来非常快,并且应用程序可以完全控制谁可以访问哪些对象。

临时证书

由于允许用户访问其文件夹中的所有内容,因此您可以{<3>}使用安全令牌服务。可以将策略分配给这些凭证,以允许访问s3://bucket_name/user_1/*。然后,Android应用程序可以使用这些凭据直接调用AWS API以下载内容(或上传或执行您分配的任何权限)。

这使应用程序可以直接与AWS进行通信,而不必为每次对象访问而调用服务器。

如果您使用联合身份验证(例如,信任Facebook),则可能需要create Temporary Security Credentials