通过API网关使用REST API上传文件的最佳方法

4
用户案例:客户可以通过公共REST API将文件上传到我们的S3存储桶,然后我们可以使用下游服务处理该文件。
经过一些研究,我找到了3种方法来实现这个目标:
  1. 使用OCTET-STREAM文件类型进行上传
  2. 使用form-data请求上传文件
  3. 使用预签名URL上传文件
在前两种情况下,用户将发送二进制文件,我们将在文件验证后将其上传到S3。
在第三种方法中,用户需要调用3个API。第一个API是获取S3预签名URL,该URL将允许用户上传文件到S3。在第二个API中,用户将上传文件到该S3预签名URL。上传完成后,用户将发送请求以处理文件。

第3步存在安全问题吗?因为用户可以使用恶意文件滥用预签名URL。

根据行业惯例,哪种方法最好?


每种方法的详细信息:

1. 使用OCTET-STREAM文件类型上传

优点:

  • 此方法适用于可以在某些应用程序中打开的文件类型,例如xlsx。
  • 1个API调用。直接上传文件

缺点:

  • 此选项不适用于上传多个文件。如果未来需要支持多个文件上传,则应更改为multipart/form-data(A2)。
  • 无法将元数据作为正文参数发送。可以将元数据发送到标头中。

2. 使用form-data请求上传文件

用户将文件作为多部分表单附加到API请求中进行上传。

优点

  • 我们可以同时发送多个文件。
  • 我们可以在正文中发送额外的参数。

3. 使用预签名URL上传文件

缺点

  • 客户必须调用3个API才能上传文件。(2个API调用以上传,然后再调用1个API以检查处理文件)
1个回答

2
如果您想让他们将数据加载到桶中,最好的方法几乎总是预签名URL。这样您就完全控制了如何分配对桶的访问权限,同时也允许他们在获得访问权限后直接上传到桶中。
在前两个示例中,用户可以向您的API发送恶意数据,可能会DOS服务器/产生成本,因为您无法控制访问(它是公共的)。
在第三种情况下,他们可以向您请求一个URL,但除此之外,除非您授予他们可以访问桶或执行其他操作的URL,否则他们不能做任何事情。这似乎比向您的上传发送大量垃圾文件并在您决定不想要它们之前处理它们要好得多。
最后,使用预签名URL是AWS希望您使用的模式,因此具有大量支持,可用于管理您想要放置在此服务周围的访问、角色、日志记录和监视等内容。当您自己建立API时,所有这些都由您来管理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接