Cognito / S3用户特定策略

时间:2014-09-05 05:35:04

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

我正在使用适用于Android的AWS开发工具包和Cognito来验证用户(通过使用亚马逊登录)到我的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},则可以正常使用。

问题

  1. 甚至可以使用LWA用户的电子邮件地址来配置它吗?
  2. 当我提出请求时,有没有办法实际记录发生了哪些参数?
  3. 我见过引用like this,但我不确定哪些实际适用。如果我以某种方式能够看到我提出请求时会遇到什么值,那就太棒了。

    提前致谢。

1 个答案:

答案 0 :(得分:2)

回答你的问题:

  1. 使用Amazon登录时,不能通过Cognito或Web身份联合执行此操作。此流程中返回的标识符是伪匿名的。 Cognito ID的格式为 us-east-1:abcd-123456-xxxxx-xxxxx-xxxx 。如果您直接使用“登录亚马逊”,则ID的格式为 amzn-1234567890
  2. 只需调用 getIdentityId 方法,即可在凭据提供程序中使用Cognito提供的ID。如果您使用的是原始Web联合身份验证流,AssumeRoleWithWebIdentityResult class包含提供者,应用程序/受众和用户ID的值。