javascript - Cognito 用户授权访问 s3 对象?

标签 javascript amazon-web-services amazon-s3 aws-lambda aws-sdk

我有将写入 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/

相关文章:

javascript - 旋转字符的 HTML 按钮

apache - Hadoop/map-reduce : Total time spent by all maps in occupied slots vs. 所有map任务花费的总时间

ember.js - 关闭 Ember 应用程序进行维护的最简单方法

javascript - 直接到 S3 文件上传 Django 和 Heroku

javascript - 如何使用 Angular js 显示和 ajax 加载器 gif

javascript - 想要在单击时将特定值发送到 javascript 处理程序

javascript - 如何避免在小视口(viewport)上打开litebox?

amazon-web-services - 如何将 AWS 即时供应 (JITP) 嵌入您的微 Controller (运行 Freertos)

amazon-web-services - 我可以在不停机的情况下升级 Elasticache Redis 引擎版本吗?

python - 如何使用 python boto 为 amazon S3 中存在的文件生成下载链接?