从移动应用程序下载 AWS S3 内容的安全方法

Secure way to download AWS S3 Contents from mobile app

问题陈述: 我想通过移动应用程序从多个移动设备下载 S3 内容。

我遇到的解决方案。

解决方案 1

  1. 在 AWS 中创建一个 IAM 用户。创建一个仅为特定存储桶下载 S3 内容的策略,并将该策略分配给 IAM 用户。
  2. 每当移动应用程序想要从 S3 下载内容时,移动应用程序将调用我的服务器 API,这将 return IAM 用户的凭据。
  3. 然后移动应用程序将使用这些凭据下载 S3 内容。

解决方案 2

  1. 使用 AWS Cognito 服务。

然而,第一种方法的问题是我必须在服务器端管理凭据。也有人可以轻松地回溯它并在应用程序外部使用这些凭据来下载内容。

第二种方法我完全不了解。然而,在 AWS COGNITO 服务的常见问题解答中,我没有找到满足我要求的任何解决方案,尽管它允许您读取、删除内容并将内容放入任何 AWS 服务。

我需要有关从移动应用程序安全下载 S3 内容的建议。

Amazon Cognito 和 AWS Mobile SDK 专为从移动应用程序下载存储在 S3 中的内容的用例而设计。您可以使用 Cognito 为应用程序的每个用户提供临时的、权限有限的 AWS 凭证。您可以让您的用户以未经身份验证的访客身份开始使用您的应用 and/or 通过社交登录或您自己的 registration/login 服务进行身份验证。

要设置 Cognito,请使用 Cognito 控制台创建身份池,这是特定于您的 AWS 账户的用户身份数据的存储。 IAM 角色定义您的用户访问 AWS 资源(如 S3)的权限。您的应用程序的用户将承担您创建的角色。您可以为经过身份验证和未经身份验证的用户指定不同的角色。要了解有关 Cognito 中 IAM 角色的更多信息,请参阅 IAM Roles

当您访问 Cognito 控制台时,向导将指导您创建身份池和必要的 IAM 角色。 Cognito(向移动应用程序用户颁发 AWS 凭证)与其他 AWS 服务之间的集成在 SDK 的初始化中进行。在 iOS、Android、Unity 和 JavaScript 上使用 Cognito 初始化开发工具包的示例代码在 Amazon Cognito 开发人员指南的 Getting Credentials topic 中。

2020 年 10 月更新: AWS 已将其“移动 SDK”转移到 AWS Amplify。 Amplify 仍然使用 Cognito 进行身份验证(登录)和授权 (credentials/permissions),因此以上内容仍然准确。您可以获得有关将 Cognito 与 Amplify 结合使用以设置身份验证的具体指导 here. Once you set up auth in Amplify, a specific example of using S3 is here

请注意,最近 Cognito 的文档专注于 用户池 ,它允许您实现自己的完整目录来存储和登录用户(针对 a cost) .但是,您不必使用 Cognito 的用户目录来存储您的用户。 Cognito Identity Pools(AFAICT 仍然免费)允许您为未登录您的应用程序的用户获取 AWS 凭证(所谓的“未经身份验证的身份”)and/or允许用户使用其他用户目录登录(例如社交登录或您拥有和管理的用户目录)。

如果你想要最终的灵活性,你也可以使用AWS STS to get credentials for accessing AWS Resources including S3。然而,随着 STS 的灵活性,需要更多地了解 IAM/AWS 和可以说更复杂的设置。

如果我能做些什么让这更清楚,请发表评论!