我正在使用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请求)时,他应该能够下载所有图像。如何提供这些图像?
这个android - flask - aws流程应该如何工作?
有两种方法可以实现这一目标。
预签名网址
将所有内容保密。然后,当客户端(例如Android应用程序)需要访问对象时,您的应用程序应通过检查数据库来验证他们是否有权访问该对象。如果允许访问,则应用程序应生成预签名URL,以授予对对象的时间限制访问权限。
创建预签名URL只需要几行代码,并且不需要调用AWS。因此,创建速度非常快,应用程序可以完全控制谁可以访问哪些对象。
临时证书
由于允许您的用户访问其文件夹中的所有内容,因此您可以使用安全令牌服务create Temporary Security Credentials。可以将策略分配给允许访问s3://bucket_name/user_1/*
的这些凭据。然后,Android应用可以使用这些凭据直接调用AWS API来下载内容(或上传,或执行您分配的任何权限)。
这允许应用程序直接与AWS通信,而不必为每个对象访问调用您的服务器。
如果您使用的是联合身份验证(例如,信任Facebook),您可能需要use Amazon Cognito to Get Credentials。