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 aud
和 sub
有什么区别?
@ChrisH aud
是令牌的 audience,在 Cognito 的情况下,这是身份池 id。 sub
是令牌的 subject,即 Cognito 身份 id。以上是关于Cognito / S3 用户特定策略的主要内容,如果未能解决你的问题,请参考以下文章
基于 Cognito ID 的 S3 文件夹访问的 IAM 策略