【问题标题】:aws cognito - allow group-chat participants access to s3 bucketaws cognito - 允许群聊参与者访问 s3 存储桶
【发布时间】:2020-06-12 22:23:05
【问题描述】:

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

决定使用 AWS S3 作为存储后端,使用 Cognito Federated Identities 对上传/下载进行身份验证 - 向/从 S3 抽取数据,而不是通过我们的服务器。

到目前为止

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

然而

我无法找到一种安全方式,仅允许群聊中的参与者从 S3 上的群聊文件夹上传/下载。

有什么想法吗?

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

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

任何赞扬/想法表示赞赏

【问题讨论】:

    标签: amazon-s3 amazon-cognito federated-identity groupchat


    【解决方案1】:

    您的问题归结为:

    “鉴于用户是组的一部分,我如何根据组成员身份授予用户访问组特定子目录的权限?”

    在我看来,你有两个选择:

    1. 为每个用户提供他们所属的所有目录的“密钥”。这可能意味着为每个组的该用户添加权限,或者为他们提供对每个组的新 IAM 角色的访问权限。这就是“想出一种为 S3 提供细粒度权限的方法”的策略。

    2. 不要分发任何特定于目录的密钥。相反,当用户请求某个目录时,请检查他们是否在该目录所属的组中。这就是“围绕 S3 构建细粒度数据存储系统”的策略。

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

    【讨论】:

    • 感谢@MyStackRunnethOver 的详尽回复。关于选项 2 中的安全性,是否有任何关于保护一个凭证来统治所有人的做法?尽管通过 HTTPS 进行通信,但应用程序上的凭据可能会被泄露(不知何故)。
    • 一个 Cognito ID 池,用于提供 AWS 凭证。我相信当前端使用凭证调用后端时,后端可以找出负责的 Cognito 身份(用户),从而决定是否响应。或者,您可以让用户将其 Cognito User 池令牌与请求一起传递,该令牌包含有关其身份的信息。你只需要在后端验证它。但我很确定有一个仅使用 ID 池凭据的自动机制
    • 谢谢@MyStackRunnethOver。 Cognito 用户池似乎提供了比 Federated Identity 更多的功能(我正在使用它 - 它是免费且轻量级的)。是的,你是对的,我的用户请求包含他们的联合身份,所以我确实在服务器端执行验证。但是,我认为一旦应用程序具有 IAM 凭据和用户 -> 组映射,后端不再参与该请求并且客户端直接调用 AWS?
    • 你在后端需要一些东西来检查请求者是否被允许做他们请求的事情 - 因此需要在 S3 周围有一个层,在后面-end,根据请求者的身份决定是允许还是拒绝请求
    • 好的 - 完成了 - 使用选项 2 并包装 S3 请求以验证用户的身份和组访问权限。非常感谢@MyStackRunnethOver - 会接受你的回答。
    猜你喜欢
    • 2020-12-18
    • 2017-06-13
    • 2022-01-23
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 2020-04-27
    相关资源
    最近更新 更多