Ole*_*Ole 4 javascript amazon-s3 amazon-web-services aws-sdk aws-lambda
我有将写入 S3 存储桶的 Cognito 用户。我假设以下过程(但也许有更好的过程?):
1)创建桶
2) 让用户使用 cognito 进行身份验证,然后将他们的资源写入存储桶。
3)让用户从存储桶中检索资源,但前提是用户将资源写入存储桶(一个额外的要求是对象必须用设置为 true 的布尔值标记,所以我假设它必须通过一个 lambda 端点才能做到这一点?)。
我想到的一件事是,也许有一种方法可以创建只能由用户访问的存储桶,这样每个用户都有自己的存储桶?
想到的另一件事是用用户 id 标记对象,并且如果用户具有正确的用户 id 并且布尔值标记设置为 true,则仅允许 lambda 端点返回对象。
想法?
可以这样做:
S3 存储桶 - 一个存储桶将用于所有用户文件。
IAM 角色 - 带有允许为上述存储桶写入对象的策略声明。
Lambda 函数 - 将承担上述角色并返回临时凭证。
将文件存储在与每个用户的 Cognito 用户名相同的路径下(例如 s3://my-bucket/some-user/file.zip)
从 S3 下载:
Lambda 函数可以生成预签名的 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
});
....
Run Code Online (Sandbox Code Playgroud)
Lambda 角色需要允许从存储桶读取对象的策略。
上传到 S3:
Lambda 函数可以承担角色(重要:限制策略仅适用于认知用户名文件夹 - 例如 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
...
}
});
...
Run Code Online (Sandbox Code Playgroud)
Lambda 角色需要允许代入角色的策略。
| 归档时间: |
|
| 查看次数: |
2680 次 |
| 最近记录: |