3

我正在使用适用于 Android 的 AWS 开发工具包和 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. 有没有办法在我发出请求时记录实际发生的参数?

我见过这样的参考资料,但我不确定哪些是真正适用的。如果我在提出请求时能够以某种方式看到所遇到的值,那将是非常棒的。

提前致谢。

4

1 回答 1

2

在回答您的问题时:

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