使用 fetch 方法从 AWS S3 下载文件会引发 CORS 错误

Posted

技术标签:

【中文标题】使用 fetch 方法从 AWS S3 下载文件会引发 CORS 错误【英文标题】:Download file from AWS S3 using fetch method throws CORS error 【发布时间】:2021-05-08 12:19:24 【问题描述】:

我将以下 s3 配置添加到我的 AWS S3 存储桶 cors 设置中。

[
    
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "https://*.herokuapp.com"
        ],
        "ExposeHeaders": []
    ,
    
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    
]

现在当我尝试使用下面的 JS 读取它时,我遇到了错误。

async function covertToBlob(url) 
  // https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html
  const resp = await fetch(url, 
    credentials: 'include',
  );
  const blobVal = await resp.blob();
  return blobVal;

错误是:

访问获取 'https://dhdhddh.s3.amazonaws.com/docs/attachment/6f56abfe-a355-44b9-b728-a642f661a8e7/file/3ed4e889-e139-4755-81e9-5383310e07e7/remote_sounding_system_Hanla.pdf' 来自原产地“http://localhost:3000”已被 CORS 政策阻止: 响应中“Access-Control-Allow-Origin”标头的值 当请求的凭证模式为 '包括'。

你能给我一些关于如何解决这个问题的想法吗?

【问题讨论】:

【参考方案1】:

https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#sending_a_request_with_credentials_included

注意:Access-Control-Allow-Origin 禁止对带有凭据的请求使用通配符:'include'。在这种情况下,必须提供确切的来源;即使您使用的是 CORS 解锁器扩展程序,请求仍然会失败。

这意味着AllowedOrigins 的值不得包含任何通配符。您必须指定准确来源。

这是根据 Fetch API 规范。

【讨论】:

CORS 规则中的意思?我可以在不更改 CORS 规则的情况下更改 JS 以使其工作吗? 是的,在 S3 存储桶的 CORS 规则中。通过 JS 更改它的唯一方法是使用credentials: 'include',在这种情况下浏览器不会在跨域调用中发送凭据。 如果我不使用credentials: 'include' 选项,那么我会得到403 好吧,在这种情况下,您调用的端点显然需要提交凭据。就像我说的那样,唯一 使用 Fetch API 进行跨域请求的方法是配置您的源(在本例中为 S3 存储桶)以允许您的引用域在其 AllowedOrigins CORS配置。存储桶必须包含 Fetch 请求来自的显式域,并且不得在其中使用任何通配符。 是的,你是对的。一旦我添加了原点,它就开始工作了。谢谢你的时间。后来你让我做的事情才有意义。我变老了。 -_-

以上是关于使用 fetch 方法从 AWS S3 下载文件会引发 CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 boto3 从 AWS S3 Bucket 下载文件会导致 ClientError: An error occurred (403): Forbidden

在 PHP 中从 AWS S3 中的文件创建 zip 的最佳方法? [关闭]

使用 AWS 开发工具包从 Amazon S3 下载文件后如何删除文件

从客户端下载 AWS S3 文件

Android-Amplify:使用 Amplify 向/从 AWS S3 上传/下载文件

如何使用AWS SDK从S3下载对象--RESTful。