【发布时间】:2021-04-18 13:40:32
【问题描述】:
目标:通过认知用户池 + 身份池分配具有自定义属性的用户:tenantId 访问他自己在 S3 中的存储桶文件夹:s3://[tenantId]/*
我已配置:
- 具有客户属性tenantId 的用户池,并授予应用客户端对该属性的读取权限
- 附加了一个身份池
- 为经过身份验证的用户创建了一个角色并将其附加到身份池中
通过登录页面,我检索到了一个有效的 idToken,并给出了这个 idToken,我执行了以下代码(没有错误处理等的简化示例):
const REGION = '...';
const USERPOOLID = '...';
const IDENTITYPOOLID = '...';
const BUCKET = '...';
const KEY = '...';
const TEST_JWT_ID_TOKEN = 'xxx.yyy.zzz';
AWS = require('aws-sdk');
AWS.config.region = REGION;
const cognitoIdentityObj = {
IdentityPoolId: IDENTITYPOOLID,
Logins : {
[`cognito-idp.${REGION}.amazonaws.com/${USERPOOLID}`]: TEST_JWT_ID_TOKEN
},
};
AWS.config.credentials = new AWS.CognitoIdentityCredentials(cognitoIdentityObj);
AWS.config.credentials.get(function (err) {
if (!err) {
const accessKeyId = AWS.config.credentials.accessKeyId;
const secretAccessKey = AWS.config.credentials.secretAccessKey;
const sessionToken = AWS.config.credentials.sessionToken;
if (accessKeyId && secretAccessKey && sessionToken) {
const AWS_S3 = new AWS.S3({accessKeyId, secretAccessKey, sessionToken});
const params = {
Bucket: BUCKET,
Key : KEY
};
AWS_S3.getObject(params, function (err, data) {
if (err) {
// err is an Access Denied
console.error(err);
} else {
console.log(data);
}
})
}
}
})
TEST_JWT_ID_TOKEN 包含一个有效的 ID 令牌,并在用户登录时通过身份池附加到一个角色。该角色的政策具有以下定义:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::<BUCKET>/${cognito-identity.amazonaws.com:custom:tenantId}/*"
]
}
]
}
但是,当我尝试从该存储桶中读取数据时,访问被拒绝,在策略中添加了一个资源行,如下所示:
arn:aws:s3:::<BUCKET>/*
成功了,所以我相当确定用户池、身份池、角色和策略的整个设置都在工作。但是属性: ${cognito-identity.amazonaws.com:custom:tenantId} 似乎没有得到识别/未评估或...
【问题讨论】:
-
似乎你想做受认知身份ID保护的s3?什么是变量“KEY”?
-
正确,通过cognito保护s3,变量KEY为存储内容的S3密钥(路径+文件/[tenantId]/folder/file.png)
-
你能找出原因吗?我在不识别自定义属性的政策方面面临同样的问题,但它适用于 ${cognito-identity.amazonaws.com:sub}
-
是的,自定义属性不能在 ARN 中使用……看看能不能找到那篇文章……
-
@GivenNyauyanga 我没有,不能在这种意义上使用自定义属性。
标签: amazon-web-services amazon-s3 amazon-cognito amazon-iam