如何从 S3 存储桶渲染图像(文件)阻止了前端的所有 public 访问(私有写入、私有读取)

How to render images(files) from S3 bucket blocked all public access in frontend( Private Write, Private read)

我已经使用 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读取就没有问题,但是我们有阻塞public-read(public-access)的需求,只允许借助访问 ID 和密钥或任何其他类似方法,访问存储桶对象或图像仅在拥有的产品(移动和 Web 应用程序)中可见。这可能吗? aws S3 是否提供此类服务?

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

你可以考虑两种选择。

第一个是通过 CloudFront 并签署 urls 或 cookie,如

中所述

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

中描述了此过程的详细信息

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

在这两种情况下,存储桶都不需要 public。对图像的访问由您的 back-end.

控制