【发布时间】:2021-08-15 05:17:25
【问题描述】:
我在 Cognito 用户池中有用户,其中一些在 Administrators 组中。需要允许这些管理员读取/写入特定的 S3 存储桶,而其他用户不得。
为了实现这一点,我为Administrators 组分配了一个角色,如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-bucket-name/*"
]
}
]
}
然后在我的 Angular 应用程序中,我登录并使用 Amplify 的 Storage 类执行以下操作:
Storage.put("test.txt", "hello")
.then(result => ...)
.catch(err => ...);
本例中的Amplify.configure 是:
const amplifyConfig = {
Auth: {
region: "eu-west-2",
userPoolId: xxx,
userPoolWebClientId: yyy,
mandatorySignIn: false,
},
Storage: {
AWSS3: {
bucket: 'my-bucket-name',
region: "eu-west-2"
}
}
};
Amplify.configure(amplifyConfig);
这里的问题是,在内部,没有向Storage.put 调用提供凭据,并且任务失败如下:
[DEBUG] 31:08.487 Credentials - Failed to load credentials
ZoneAwarePromise {__zone_symbol__state: false, __zone_symbol__value: NotAuthorizedException:
Unauthenticated access is not supported for this identity pool.
仔细阅读,这似乎是因为您没有获得凭据根本,除非您有一个联合身份池。因此,我创建了一个附加到我的用户池 + 应用程序客户端的身份池,使用所有默认值,并将其 ID 添加到我的 Amplify.configure 配置中。
这仍然行不通,但这次我确实获得了凭据 - 它们适用于身份池的Authenticated Role中指定的 IAM 角色。
所以现在如果我将上述 S3 权限添加到该角色,我的所有代码都可以正常工作,但是现在 所有 用户(不仅仅是管理员)可以读/写管理员的桶。啊。
那么,当且仅当我是管理员时,如何获取管理员用户组设置中指定角色的凭据?
或者,是否可以通过联合身份中的一些巧妙设置来解决此问题,从而根据用户组分配正确的角色?
【问题讨论】:
标签: amazon-web-services amazon-s3 amazon-cognito aws-amplify