Cognito / S3 用户特定策略

Posted

技术标签:

【中文标题】Cognito / S3 用户特定策略【英文标题】:Cognito / S3 User Specific Policies 【发布时间】:2014-10-30 00:19:18 【问题描述】:

我正在使用适用于 android 的 AWS 开发工具包和 Cognito 来验证用户(通过使用 Amazon 登录)到我的 AWS 资源。我正在尝试做的是像这样设置一个 S3 存储桶:

./my-bucket
  ├── first_user@email.com
  └── second_user@email.com

因此,my-bucket 存储桶将包含基于用户电子邮件地址的文件夹。

我第一次设置政策是这样的:


  "Version": "2012-10-17",
  "Statement": [
    
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::my-bucket"]
    ,
    
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Resource": [
        "arn:aws:s3:::my-bucket/$www.amazon.com:user_id",
        "arn:aws:s3:::my-bucket/$www.amazon.com:user_id/*"
      ]
    
  ]

作为测试,我正在尝试为这样的用户下载一个文件夹:

final Map logins = new HashMap();
logins.put("www.amazon.com", token);
credentialsProvider.withLogins(logins);

final TransferManager transferManager = new TransferManager(credentialsProvider);
MultipleFileDownload download = transferManager.downloadDirectory("my-bucket", "first_user@email.com", new File("/sdcard/Download"));

但是,当我运行它时,我得到一个“禁止”异常。如果我修改策略以明确引用 first_user@email.com 而不是 $www.amazon.com:user_id 它工作正常。

问题

    这甚至可以使用 LWA 用户的电子邮件地址来配置它吗? 有没有办法在我发出请求时记录实际发生的什么参数?

我看过参考资料like this,但我不确定哪些是实际适用的。如果我能够以某种方式看到在我提出请求时会遇到什么值,那就太好了。

提前致谢。

【问题讨论】:

【参考方案1】:

回答您的问题:

    不,使用 Cognito 或 Web 身份联合是不可能做到这一点的,只需登录 Amazon。此流程中返回的标识符是伪匿名的。 Cognito ID 的格式为 us-east-1:abcd-123456-xxxxx-xxxxx-xxxx。如果您直接使用 Login with Amazon,则 ID 的格式为 amzn-1234567890。 只需调用 getIdentityId 方法,即可在凭据提供程序上使用从 Cognito 提供的 ID。如果您使用的是原始 Web 联合身份验证流程,AssumeRoleWithWebIdentityResult class 包含提供者、应用程序/受众和用户 ID 的值。

【讨论】:

文件夹是否是电子邮件并不重要;我只是感到困惑,因为我不知道 什么 变量可供我使用。有没有办法得到它? 另外,根据你的说法,我认为如果我在设备上使用$cognito-identity.amazonaws.com:sub,我只需要使用来自getIdentityId 的返回值就可以了。 @Levi 你是对的,$cognito-identity.amazonaws.com:sub$cognito-identity.amazonaws.com:aud 是你可以使用的变量。 @BobKinney audsub 有什么区别? @ChrisH aud 是令牌的 audience,在 Cognito 的情况下,这是身份池 id。 sub 是令牌的 subject,即 Cognito 身份 id。

以上是关于Cognito / S3 用户特定策略的主要内容,如果未能解决你的问题,请参考以下文章

基于 Cognito ID 的 S3 文件夹访问的 IAM 策略

Cognito:联合身份 ID 和用户属性

S3 存储桶策略授予/限制对特定联合用户的访问权限

允许用户访问特定 S3 存储桶进行备份的 AWS IAM 策略

如何将 ARN 设置为 s3 策略资源 AWS

如何纯粹使用 Cognito 对用户进行身份验证以供 S3 使用