我有将写入 S3 存储桶的 Cognito 用户。我假设以下过程(但也许有更好的过程?):
1)创建桶
2) 让用户使用 cognito 进行身份验证,然后将他们的资源写入存储桶。
3) 让用户从桶中检索资源,但前提是用户将资源写入桶(额外的要求是对象必须用设置为 true 的 bool 值标记,所以我我假设它必须通过 lambda 端点才能执行此操作?)。
我想到的一件事是,也许有一种方法可以创建只能由用户访问的存储桶,这样每个用户都有自己的存储桶?
要想到的另一件事是用用户 ID 标记对象,并且仅当用户具有正确的用户 ID 且 bool 值标记设置为 true 时才允许 lambda 端点返回对象。
想法?
最佳答案
可以这样做:
S3 存储桶 - 一个存储桶将用于所有用户文件。
IAM Angular 色 - 具有允许为上述存储桶写入对象的策略声明。
Lambda 函数 - 将担任上述 Angular 色并返回临时凭证。
将文件存储在与每个用户的 Cognito 用户名相同的路径下(例如 s3://my-bucket/some-user/file.zip)
从 S3 下载:
Lambda 函数可以 generate pre-signed URL并归还它。检查 Cognito 用户名(来自 JWT)是否等于文件夹名称(如果不是 - 返回例如 403 状态)或 - 作为输入,只需获取文件名并连接 Cognito 用户名和文件名。
示例(Node.js):
...
const preSignedUrl = s3.getSignedUrl('getObject', {
Bucket: '<BUCKET NAME>',
Key: '<cognito user name>/<file name>', // path to object in bucket above
Expires: 3600 // expiration time in seconds
});
....
Lambda Angular 色需要允许从存储桶中读取对象的策略。
上传到 S3:
Lambda 函数可以 assume role (重要:仅针对 cognito 用户名文件夹限制策略 - 例如 s3://my-bucket/some-user/*)并返回临时凭证。使用它们 - 用户只能从浏览器上传到 S3 到他的目录。
示例(Node.js):
...
const BUCKET_NAME = <...>
const COGNITO_USER_NAME = <...>
const restrictedPolicy = {
Version:'2012-10-17',
Statement: [{
Effect: 'Allow',
Action: 's3:PutObject',
Resource: `arn:aws:s3:::${BUCKET_NAME}/${COGNITO_USERNAME}/*`
}]
}
sts.assumeRole({
DurationSeconds: 3600, // expiration time in seconds
RoleArn: '<...>', // role that has write access to whole s3 bucket
RoleSessionName: '<cognito username>', // not much importance
Policy: JSON.stringify(restrictedPolicy) // write access only for Cognito username folder
}, (err, data) => {
if(err) {
...
} else {
const temporaryCredentials = data.Credentials // Lambda needs to return that to API Gateway via callback
...
}
});
...
Lambda Angular 色需要允许代入 Angular 色的策略。
关于javascript - Cognito 用户授权访问 s3 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49782492/