【问题标题】:How to render images(files) from S3 bucket blocked all public access in frontend( Private Write, Private read)如何从 S3 存储桶渲染图像(文件)阻止了前端的所有公共访问(私有写入,私有读取)
【发布时间】:2020-12-14 23:27:38
【问题描述】:

我已使用 aws-sdk 将文件上传到 S3 存储桶:

async function uploadFileToAws(file){
    const fileName = `new_file_${new Date().getTime()}_${file.name}`;
    const mimetype = file.mimetype;
    const params = {
        Bucket: config.awsS3BucketName,
        Key: fileName,
        Body: file.data,
        ContentType: mimetype,
        // ACL: 'public-read'
    };
    const res = await new Promise((resolve, reject) => {
        s3.upload(params, (err, data) => err == null ? resolve(data) : reject(err));
    });
    return { secure_url: res.Location };
}

如果我们允许bucket权限公开读取那么没有问题,但是我们有阻塞public-read(public-access)的要求,并且只允许bucket对象或图像的访问只在自己的产品中可见(移动和网络应用程序)在访问 ID 和密钥或任何其他类似方法的帮助下。这可能吗? aws S3 是否提供此类服务?

我浏览了 aws s3 文档、谷歌搜索并浏览了多个 StackOverflow 线程和一些博客,但没有运气。我非常感谢您的建议、提示和帮助。

【问题讨论】:

  • 您的用户是否必须先对您的应用或网站进行身份验证才能访问图像?
  • 是的,我们在用户访问图像之前进行了用户身份验证。

标签: node.js amazon-web-services amazon-s3 aws-sdk


【解决方案1】:

您可以考虑两种选择。

第一个将通过 CloudFront 和签名的 url 或 cookie,如

中所述

基本上,在这种方法中,您将设置一个 CloudFront 分配,用于为您的私有图像提供服务。由于用户已通过身份验证,因此您的后端需要验证他们是否可以访问给定的图像,如果可以,则为该文件生成一个签名的 URL。签名的 url 将启用对所述文件的访问。此过程的详细信息在How Signed URLs Work 中进行了描述。

第二种可能是通过pre-signed S3 URLs。它在某种程度上类似于第一个,只是它不涉及任何额外的服务,例如 CloudFront。同样,由于用户经过身份验证,您的后端将验证他们查看给定图像的权限,并生成预签名的 S3 url 以使他们能够临时访问图像。

在这两种情况下,存储桶都不需要公开。对图像的访问由您的后端控制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-25
    • 2017-03-19
    • 1970-01-01
    • 2019-10-06
    • 2016-10-18
    • 2019-11-18
    • 2018-01-14
    • 2020-02-29
    相关资源
    最近更新 更多