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

时间:2017-07-18 00:52:37

标签: amazon-web-services amazon-s3 amazon-cognito

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

my-bucket
  ├── product-a
  │     ├── file-1
  │     ├── file-2
  │     └── file-3
  ├── product-b
  │     ├── file-1
  │     ├── file-2
  │     └── file-3
  └── etc...

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

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

{
  "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}/*"
      ]
    }
  ]
}

但我希望创建一个策略,允许用户访问product-a文件夹,当且仅当他们购买了该产品时,例如使用该用户的Cognito Sync数据中包含的某个标志。

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

1 个答案:

答案 0 :(得分:0)

在我的用例中,由于以下原因,这是可能的:

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