Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon s3 aws cognito-允许群组聊天参与者访问s3 bucket_Amazon S3_Amazon Cognito_Federated Identity_Groupchat - Fatal编程技术网

Amazon s3 aws cognito-允许群组聊天参与者访问s3 bucket

Amazon s3 aws cognito-允许群组聊天参与者访问s3 bucket,amazon-s3,amazon-cognito,federated-identity,groupchat,Amazon S3,Amazon Cognito,Federated Identity,Groupchat,我正在实现一个支持群聊的iOS应用程序,用户可以在其中添加照片和其他文件 决定将AWS S3作为存储后端,使用Cognito联合身份验证上传/下载—数据从S3传输到S3,而不是通过我们的服务器 目前为止 我的实现允许用户/标识上传并下载到S3存储桶上自己的文件夹中(示例策略arn:aws:S3:::mybucket/users/${cognito identity.amazonaws.com:sub}/*变量为identityID/user_id) 然而 我还没有找到一种安全的方式,只允许群组聊

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

决定将AWS S3作为存储后端,使用Cognito联合身份验证上传/下载—数据从S3传输到S3,而不是通过我们的服务器

目前为止 我的实现允许用户/标识上传并下载到S3存储桶上自己的文件夹中(示例策略
arn:aws:S3:::mybucket/users/${cognito identity.amazonaws.com:sub}/*
变量为identityID/user_id)

然而 我还没有找到一种安全的方式,只允许群组聊天的参与者从S3上的群组聊天文件夹上传/下载

有什么想法吗? 关于可能的流程的一些想法:

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

  • 您的问题归结为:

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

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

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

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


  • 我建议采用后一种方法,因为您没有为每个用户或每个组设置IAM角色或凭据,而是为所有用户提供一个凭据:请求S3包装器所需的凭据。如果跟踪用户所在的组,那么包装器需要做的就是检查
    user->groups
    映射,查看是否应该满足请求。前端可以使用相同的映射来美化UI:用户只显示从他们所属的组上载/下载的选项。在本例中,我将映射设想为一个Dynamo表,每当用户注册、加入组、离开组或删除其帐户时,该表都会更新。您可以通过用户的Cognito凭据(包括用户特定字段)来识别用户。

    感谢@MyStackRunnethOver提供全面的答复。关于选项2中的安全性,是否有关于保护一个凭证以管理所有凭证的做法?虽然通过HTTPS进行通信,但应用程序上的凭据可能会受到损害(不知何故)。提供AWS凭据的Cognito ID池。我相信,当前端使用凭证呼叫后端时,后端可以找出负责的Cognito身份(用户),从而决定是否响应。或者,您可以让用户通过请求传递他们的Cognito用户池令牌,该请求将包含关于他们身份的信息。您只需在后端验证它。但我很确定,有一种自动机制只使用ID池证书谢谢@MyStackRunnethOver。Cognito用户池提供的功能似乎比联邦身份(我正在使用的,它是免费和轻量级的)更多。是的,你说得对,我的用户请求包含他们的联合身份,所以我在服务器端执行验证。然而,我认为一旦应用程序拥有IAM凭证和用户->组映射,后端就不再参与该请求,客户端直接调用AWS?你需要在后端做一些事情来检查请求者是否被允许做他们请求的事情-因此在后端S3周围需要有一个层,根据请求者的身份决定是允许还是拒绝请求—完成—使用选项2和包装S3请求来验证用户的身份和组访问权限。非常感谢@MyStackRunnethOver-将接受您的回答。