限制对特定Cognito用户的S3对象访问

set*_*hro 6 amazon-s3 amazon-web-services amazon-cognito

我正在开发一个应用程序,它将管理对存储在S3中的已购买文件的访问.我在S3中按产品组织文件,例如:

my-bucket
  ??? product-a
  ?     ??? file-1
  ?     ??? file-2
  ?     ??? file-3
  ??? product-b
  ?     ??? file-1
  ?     ??? file-2
  ?     ??? file-3
  ??? etc...
Run Code Online (Sandbox Code Playgroud)

我还使用Cognito来管理用户身份和身份验证.我想创建一个IAM角色,所有用户都会认为这个角色只允许他们访问他们购买的产品的文件.这样做的正确方法是什么?我已经阅读了Cognito的文档,我觉得我只是没有完全连接点.

我从这个例子中看到,我可以为每个用户提供对存储桶中自己的文件夹的访问权限,但之后我必须将文件复制到每个用户的文件夹,这似乎既低效又容易出错.

{
  "Version": "2012-10-17",
   "Statement": [
   {
     "Effect": "Allow",
     "Action": ["s3:ListBucket"],
     "Resource": ["arn:aws:s3:::my-bucket"],
      "Condition": {"StringLike": {"s3:prefix": ["cognito/myapp/"]}}
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::my-bucket/myapp/${cognito-identity.amazonaws.com:sub}",
        "arn:aws:s3:::my-bucket/myapp/${cognito-identity.amazonaws.com:sub}/*"
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

但我希望创建一个策略,授予用户访问product-aif和仅当他们购买该产品的文件夹的权限,比如说使用该用户的Cognito Sync数据中包含的一些标志.

这可能吗?我只是没有使用正确的工具?我认为这必须是一个常见的用例.

Dan*_*aut 2

在我的用例中,这是可能的,原因如下:

  1. 我将文件上传到 s3
  2. 我有一个 lambda 监听 S3 事件,它解释创建的此文件并在 DynamoDB(我们应用程序的数据库引擎)中创建一个条目。但是,此条目包含访问此文件的 url,而不是 s3 url。相反,它是一个代理请求的 API 网关 URL,并且上面有一个自定义 lambda 授权者。然后,此 lambda 授权程序通过查看 cognito 令牌来验证用户访问权限,并让我为其他用户添加完全细粒度的访问权限,同时仍然让核心用户/所有者直接使用 S3 sdk 客户端并附加正确的 cognito 身份角色来管理文件到存储桶权限。
  3. 然后,用户在请求中使用授权认知令牌标头来请求该图像,该图像由 API 网关处理并返回相关响应。