接受对 S3 的 CORS 请求以进行文件显示,但不接受 Javascript 库的加载

Posted

技术标签:

【中文标题】接受对 S3 的 CORS 请求以进行文件显示,但不接受 Javascript 库的加载【英文标题】:CORS Request to S3 Accepted for File Display but Not for Load by Javascript Library 【发布时间】:2022-01-12 22:53:45 【问题描述】:

我正在开发一个从 S3 检索文件的小型 javascript 浏览器脚本。

在向 S3 请求 SignedUrl 后,我可以毫无问题地在标签中显示图像。为此,我更新了 S3 上的 CORS 政策:

[
    
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET",
            "HEAD",
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    
]

但是,当我想使用相同的 URL 来提取 EXIF 数据(使用 ExifReader)时,我收到一条关于 CORS 策略的错误消息:

Access to fetch at '*SIGNEDURL*' from origin 'null' has been blocked
by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. 
If an opaque response serves your needs, set the request's mode to
'no-cors' to fetch the resource with CORS disabled.

我不明白两者行为的区别。有人可以帮忙吗?

谢谢

【问题讨论】:

【参考方案1】:

只有 <script> 加载的内容受 CORS 限制,而直接由 DOM 加载的内容不受。

如果不了解您是如何生成链接的,就很难给出明确的答案。调试问题的一种简单方法是简单地将crossorigin 属性添加到您的图像标签,例如<img src="..." crossorigin />。如果它停止渲染,则问题出在链接上。

您的配置看起来正确。剩下的最常见原因是您在预签名 url 时没有指定区域。签名的 url 应该看起来像:https://s3.us-east-1.amazonaws.com(或者你的存储桶所在的任何区域),而不是 https://s3.amazonaws.com

这是 v3 客户端的示例

import  GetObjectCommand, S3Client  from '@aws-sdk/client-s3';
import  getSignedUrl  from '@aws-sdk/s3-request-presigner';

// ...
const s3Client = new S3Client(
  region: 'us-east-1', // <--- NEED THIS
);

const command = new GetObjectCommand(
  Bucket: 'YOUR_BUCKET',
  Key: 'YOUR_OBJECT_KEY',
);

const url = await getSignedUrl(s3Client, command, 
  expiresIn: 3600,
);

或与老客户:

import AWS from 'aws-sdk';

// ...
const s3Client = new AWS.S3(
  region: 'us-east-1', // <--- NEED THIS
);

const url = s3Client.getSignedUrl('getObject', 
  Bucket: 'YOUR_BUCKET',
  Key: 'YOUR_OBJECT_KEY',
  Expires: 3600,
);

【讨论】:

以上是关于接受对 S3 的 CORS 请求以进行文件显示,但不接受 Javascript 库的加载的主要内容,如果未能解决你的问题,请参考以下文章

S3 服务 mpeg-dash,将加载清单,但包上的 CORS 失败

不接受 S3 存储桶 CORS 配置

S3 的私有内容 CORS 问题

如何获取 Rails 应用程序的 CORS 标头以访问 aws s3 存储桶?

Laravel + Plupload 上传到 S3 响应以进行预检无效 - CORS

选项请求的 AWS S3 CORS 403 错误