我的想法是创建一个 S3 存储桶以允许用户上传二进制对象。下一步是确认上传,然后 API 将启动文件处理。
为了使其更安全,客户端将首先请求上传位置。然后,API 会在 S3 上为此上传分配并预先创建一个一次性使用目录,并在该目录上设置访问策略以允许将文件转储到该目录中(但最好不要读取甚至覆盖)。
客户端确认后,API 启动处理和清理。
我面临的问题是身份验证和授权。最简单的是允许使用难以猜测的存储桶目录进行公共写入,例如
s3://存储桶/年/月/日/UUID/UUID/文件名
添加日期是为了以后清理孤立文件(并且如果数量增长到需要它,可以添加小时/分钟。
除了提供唯一的上传位置之外,第一个 UUID 没有任何意义。第二个标识用户。
整个路径由 API 创建。然后,API 允许用户访问写入该最终目录。 (不应允许用户创建此目录)。
我遇到的问题是,从谷歌搜索看来,公共可写 S3 存储桶被认为是不好的做法,甚至是可怕的做法。
我还有什么选择?
a) 向客户端提供某种访问令牌?
b) 为每个上传者创建一个 IAM 帐户(我不想以这种方式与 Amazon 绑定)
c) 还有其他选择吗?
P.S 是否可以控制客户端可用于从策略创建文件的实际文件名?
据我了解,您的目标是:
- 安全地允许用户上传特定文件到 S3 存储桶
-
限制访问通过阻止用户读取或写入其他文件
- 理想情况下,上传文件直接到S3无需通过您的服务器
您可以通过生成来做到这一点预签名的 PUT URL https://docs.aws.amazon.com/AmazonS3/latest/dev/PresignedUrlUploadObject.html服务器端并将这些 URL 返回给客户端。客户端可以使用这些 URL 直接上传到 S3。客户端仅限于您在签署 URL 时指定的文件名。它将仅限于 PUT。您将 AWS 访问密钥安全地保存在服务器上,并且永远不要将其发送到客户端。
如果您使用 PutObject API,则只需对每个文件的一个 URL 进行签名。如果您使用分段上传 API,则情况会稍微复杂一些,您需要在服务器端开始和完成上传,并将预先签名的 UploadPart URL 发送到客户端。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)