Cognito / S3 用户特定策略

3

我正在使用AWS SDK for Android和Cognito来认证用户(通过Login With 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},它就可以正常工作。

问题

  1. 使用LWA用户的电子邮件地址配置是否可行?
  2. 是否有一种方法可以记录请求时发生了哪些参数?

我看到过像这样的参考,但我不确定哪些适用。如果我能够看到请求时传递的值,那将是非常好的。

提前感谢您的帮助。

1个回答

2
回答您的问题:
1. 使用Cognito或仅使用“登录Amazon”无法实现此操作。在此流程中返回的标识符是伪匿名的。Cognito ID的格式为。如果直接使用“登录Amazon”,ID的格式将为。
2. 从Cognito提供的ID可以通过简单调用getIdentityId方法来获取。如果使用原始的Web身份联合流程,则AssumeRoleWithWebIdentityResult类包含有关提供程序、应用程序/受众和用户ID的值。

并不是必须将文件夹作为电子邮件;我只是感到困惑,因为我不知道有哪些变量可供使用。有没有办法获取它们? - Levi
根据你所说的,我认为如果我在设备上使用${cognito-identity.amazonaws.com:sub},只需要使用getIdentityId的返回值就可以了。 - Levi
@Levi 您是正确的,${cognito-identity.amazonaws.com:sub}${cognito-identity.amazonaws.com:aud} 是您可以使用的变量。 - Bob Kinney
@BobKinney,audsub有什么区别? - ChrisH
2
@ChrisH aud 是令牌的受众,在 Cognito 的情况下,这是身份池 ID。sub 是令牌的主题,即 Cognito 身份 ID。 - Bob Kinney
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接