【发布时间】:2020-03-04 12:16:30
【问题描述】:
我正在创建一个 Web 应用程序,该应用程序需要将 S3 存储桶中的大文件提供给用户以供下载。我们应用程序中的用户由 Cognito 授权。我想要一个包含文件的 S3 存储桶,这样某些 Cognito 用户只能下载某些文件。根据我的研究,我发现了几种方法。据我所知,其中没有一个似乎完全适合我的用例。
AWS 允许 S3 存储桶获得 Cognito 用户的许可。这与我需要的非常接近,但实际上似乎并不可用。在我们应用程序的安全方案中,Cognito 登录属于一个组织。每个组织在后端共享其所有数据。因此,我需要允许由我的数据库定义的组织中的所有登录名访问 S3 存储桶,而不是按名称的用户登录名。
在某种程度上,预签名 URL 似乎是一个典型的用例,但我认为仍然不是我真正需要的。预签名 URL 将为我提供一个过期 URL,供用户下载文件。很好,所以我可以给每个用户一个可能是用户自定义的 URL,但我可以在我的后端发出几个。但我真的不希望 URL 过期,我希望它永远存在。这不是什么大问题,因为永久 URL 可能是一个 API 端点,它重定向到动态创建的预签名 URL,该 URL 可能会在一分钟内到期。但是该 URL 将允许任何拥有它的人访问。这不符合我们通过登录将 URL 限制为 Cognito 用户的安全模型。如果该 URL 通过用户剪切和粘贴或者可能是数据包嗅探器而泄露,那么安全性似乎就会崩溃。确实该 URL 已过期,但它似乎并不完全适合该项目。
我考虑过的另一个选项是自己在代码中实现这一点,方法是创建一个 API 端点,该端点创建一个可下载的文件流,该文件流是通过将 S3 对象也作为文件流访问来创建的。它会将文件读入内存并将其流式传输给用户。安全性似乎完全符合我们的需求,因为该 API 端点当然会验证 Cognito 用户的身份验证令牌。但是,从 S3 存储桶读取到我的后端然后转给用户是不必要的网络流量,可能会更慢,并且在后端进程中还可能需要大量内存。
似乎切断中间人并允许用户直接访问 S3 存储桶(尽管有正确的用户权限限制)将是最佳解决方案。我只是可以找到以适合我项目的最佳实践推荐方式执行此操作的任何项目或教程。我认为我的项目有一个非常常见的用例。有没有更好的方法来做到这一点?
【问题讨论】:
-
你的问题最后解决了吗?
-
我刚刚以中间人的身份通过我的 HTTPS API。
标签: amazon-web-services amazon-s3 amazon-cognito pre-signed-url