aws cognito - 允许群聊参与者访问 s3 存储桶

aws cognito - allow group-chat participants access to s3 bucket

我正在实施一个 iOS 支持群聊的应用程序,用户可以在其中添加照片和其他文件。

决定将 AWS S3 作为存储后端,使用 Cognito Federated Identities 进行身份验证 upload/downloads - 数据泵送 to/from S3,而不是通过我们的服务器。

到目前为止

我的实现允许 user/identity 上传和下载到他们在 S3 存储桶上自己的文件夹(示例策略 arn:aws:s3:::mybucket/users/${cognito-identity.amazonaws.com:sub}/* 变量是 identityID/user_id)。

但是

我一直无法找到一种安全的方式,只允许群聊中的参与者从 S3 上的群聊文件夹 upload/download。

有什么想法吗?

关于可能流程的一些想法:

  1. 首先,用户将照片上传到自己的文件夹,[我知道怎么做]
  2. 然后,系统将照片复制到群聊的文件夹中[我知道怎么做]
  3. 将群组聊天文件夹与参与者的身份相关联[不确定如何 - 可能有数千个群组和参与者]
    • 编辑 1:正如@MyStackRunnethOver 建议的那样,可以使用一个 IAM role/credential 来管理所有 upload/download 用户请求(属于该组) [严重的安全问题 如果凭据被泄露 ]。
  4. 编辑 1:可以使用预签名 URL:文件上传到用户自己的文件夹,预签名 url 存储在群聊条目中 [最大 url-生命7天不过]
    • 客户端缓存有助于参与者 join/leave 一组频繁
    • 需要服务器端计划作业来更新过期的预签名 URL

任何commends/ideas赞赏

您的问题归结为:

"Given that users are part of groups, how can I give users access to group-specific subdirectories based on group membership?"

据我所知,您有两个选择:

  1. 为每个用户提供 "key" 访问他们所属的所有目录的权限。这可能意味着为每个组向该用户添加权限,或者为他们提供对每个组的新 IAM 角色的访问权限。这就是"come up with a way to have fine-grained permissions for S3"策略。

  2. 不要分发任何目录特定的密钥。相反,当用户请求某个目录时,检查他们是否在该目录所属的组中。这就是"build a fine-grained data storage system around S3"策略。

我推荐后一种方法,因为不是每个用户或每个组都有一个 IAM 角色或凭据,而是给 所有 你的用户一个凭据:创建所需的凭据您的 S3 包装器的请求。如果您跟踪您的用户所在的组,您的包装器需要做的就是检查 user -> groups 映射以查看是否应满足请求。前端可以使用相同的映射来美化 UI:仅向用户显示从他们所属的组上传/下载的选项。在这种情况下,我会将映射设想为 Dynamo table,每当用户注册、加入群组、离开群组或删除他们的帐户时都会更新。您可以通过他们的 Cognito 凭据来识别您的用户,其中包括用户特定的字段。