从 iOS 应用上传到 Amazon S3

Posted

技术标签:

【中文标题】从 iOS 应用上传到 Amazon S3【英文标题】:Upload from iOS App to Amazon S3 【发布时间】:2012-01-05 14:55:37 【问题描述】:

让我们从问题陈述开始:

我的 ios 应用程序有一个登录表单。当用户登录时,会调用我的 API 并授予或拒绝访问权限。如果授予访问权限,我希望用户能够将图片上传到他的帐户和/或管理它们。

作为存储,我选择了 Amazon S3,并且我认为拥有一个名为“myappphotos”的存储桶是个好主意,其中包含许多文件夹。文件夹名称是用户电子邮件的哈希值和密钥。因此,每个用户在我的 Amazon S3 存储桶中都有自己独特的文件夹。

由于我最近才开始使用 AWS,所以这是我的问题:

设置这样的系统的最佳做法是什么?我希望用户能够将图片直接上传到 Amazon S3,但我当然不能对访问密钥进行硬编码。所以我需要我的 API 以某种方式与 Amazon 对话并请求各种访问令牌 - 仅适用于属于我提出请求的用户的特定文件夹。

谁能帮助我和/或引导我找到解决类似问题的一些来源?不要以为我是第一个,而且亚马逊文档非常丰富,我真的不知道从哪里开始。

非常感谢!

【问题讨论】:

【参考方案1】:

你看过Amazon AWS SDK for iOS吗?

来自文档:

AWSiOSDemoTVM 和 AWSiOSDemoTVMIdentity 示例演示了更多 将 AWS 安全凭证传输到移动设备的安全机制 客户。这些示例需要一个服务器应用程序,在这种情况下 令牌自动售货机 (TVM),作为单独的下载提供。 示例应用程序以匿名方式或通过 TVM 注册 用户提供的用户名和密码。 TVM 使用 AWS 安全性 令牌服务获取临时安全凭证并将其传递给 移动应用程序。

TVM 有两种形式,一种支持匿名 注册和一个需要用户名和密码的 注册设备并接收安全令牌。下载并安装 用于匿名注册的 TVM,请访问 http://aws.amazon.com/code/8872061742402990。下载并安装 用于身份注册的 TVM,请访问 http://aws.amazon.com/code/7351543942956566.

来自Authenticating Users of AWS Mobile Applications with a Token Vending Machine:

本文讨论了一种支持应用程序的架构 在移动设备上运行以更安全地与 Amazon Web 交互 Amazon Simple Storage Service (S3)、Amazon SimpleDB、 Amazon Simple Notification Service (SNS) 和 Amazon Simple Queue 服务 (SQS)。所讨论的架构使用“代币售卖 Machine”将临时安全凭证分发到移动设备 应用。

您的令牌可以限制对 S3 上特定存储桶的访问,因此它似乎是最佳选择。

【讨论】:

我在自己的回答中进一步澄清了这一点。【参考方案2】:

ASIHTTPRequest 直接支持 Amazon S3。

http://allseeing-i.com/ASIHTTPRequest/S3

【讨论】:

问题是当您为用户提供 S3 空间时,如何避免将您的密钥与您的应用一起分发? ASIHTTPRequest 需要一个密钥。【参考方案3】:

您可以限制用户对文件夹级别的访问。请参考此示例Credential Management。

【讨论】:

【参考方案4】:

为了进一步澄清特里威尔科克斯的回答......

您需要使用AWS STS在您的服务器上生成临时安全凭证

STS 是 AWS 的“安全令牌服务”。它允许您以编程方式创建访问密钥并设置特定的权限和到期日期。

由于您的应用程序已经有一个 API/后端来验证您的用户,因此您可以进行 API 调用,生成只能访问该用户文件夹的临时 AWS 凭证。

如果您的应用没有后端,Amazon 会提供一个 Java 应用调用 TVM(令牌自动售货机),您可以轻松地将自己的实例部署到 Elastic Beanstalk。

AWS 相关文章:http://aws.amazon.com/articles/4611615499399490 http://docs.aws.amazon.com/STS/latest/UsingSTS/STSUseCases.html#MobileApplication

【讨论】:

【参考方案5】:

2020 - 你应该使用亚马逊官方工具:Amplify

它基本上要求您的用户对应用程序进行身份验证(有点类似于 Firebase),从而为您保护连接。

这里有一个很好的文件上传示例: https://docs.amplify.aws/lib/storage/getting-started/q/platform/ios#initialize-amplify-storage

【讨论】:

以上是关于从 iOS 应用上传到 Amazon S3的主要内容,如果未能解决你的问题,请参考以下文章

如何将文件直接从 Django admin 上传到 Amazon S3?缓解 Heroku 应用程序错误(超时)

从 Ruby on Rails 多次上传到 Amazon S3 - 使用啥后台处理系统?

Amazon S3 iOS SDK 照片上传有时会出错 - SignatureDoesNotMatch

无法将应用程序上传到 Amazon S3

将流数据上传到 Amazon S3

Amazon S3 上传访问被拒绝