我有一些认知用户会写到一个S3桶中。我假设以下过程(也许还有一个更好的过程?):
1)创建桶
2)让用户使用认知进行身份验证,然后将资源写入桶中。
3)让用户从桶中检索资源,但前提是用户必须将资源写入桶(另一个要求是,对象必须使用设置为true的布尔值进行标记,因此我认为它必须通过lambda端点才能完成吗?)
我脑海中闪现的一件事是,也许有一种方法可以创建只有用户才能访问的桶,这样每个用户都有自己的桶吗?
想到的另一件事是用用户id标记对象,并且只允许lambda端点返回对象,如果用户有正确的用户id,并且布尔值标记被设置为true。
有什么想法?
发布于 2018-04-11 20:08:03
可以这样做:
将文件存储在与每个用户相同的路径下(例如:S3://my/ username /file.zip)
从S3下载
Lambda函数可以生成预先签名的URL并返回它。检查认知用户名(来自JWT)是否等于文件夹名(如果不是-返回403状态)或-作为输入,只需获得文件名并连接认知用户名和文件名。
示例(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角色需要允许从桶读取对象的策略。
上传到S3
Lambda函数可以承担角色 (重要的:仅对认知用户名文件夹限制策略-例如S3://my/ only /*)并返回临时凭据。有了它们,用户只能从浏览器上传到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角色需要允许承担角色的策略。
https://stackoverflow.com/questions/49782492
复制相似问题