如何让我的数据库中的用户只从s3存储桶下载他的图像?

问题描述 投票:-1回答:1

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

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

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

  • 使用aws cloudfront和oai
  • 烧瓶使用boto3 generate_presigned_url()
  • 将桶内容公开(我绝对不想要)

这个android - flask - aws流程应该如何工作?

android amazon-web-services amazon-s3 flask amazon-cloudfront
1个回答
0
投票

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

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

预签名网址

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

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

临时证书

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

这允许应用程序直接与AWS通信,而不必为每个对象访问调用您的服务器。

如果您使用的是联合身份验证(例如,信任Facebook),您可能需要use Amazon Cognito to Get Credentials

© www.soinside.com 2019 - 2024. All rights reserved.