访问 s3 对象的 Cognito 用户授权?

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 端点返回对象。

想法?

Mic*_* Z. 5

可以这样做:

  • 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 角色需要允许代入角色的策略。