136

我正在尝试通过 XMLHttpRequest 从 Firebase 存储下载文件,但未在资源上设置 Access-Control-Allow-Origin,因此这是不可能的。有没有办法在存储服务器上设置这个标头?

  (let [xhr (js/XMLHttpRequest.)]
    (.open xhr "GET" url)
    (aset xhr "responseType" "arraybuffer")
    (aset xhr "onload" #(js/console.log "bin" (.-response xhr)))
    (.send xhr)))

铬错误信息:

XMLHttpRequest 无法加载 https://firebasestorage.googleapis.com/[EDITED] 请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许访问源“ http://localhost:3449 ”。

4

4 回答 4

256

来自firebase-talk group/list 上的这篇文章

为 CORS 配置数据的最简单方法是使用gsutil命令行工具。的安装说明gsutil可在https://cloud.google.com/storage/docs/gsutil_install获得。安装gsutil并使用它进行身份验证后,您可以使用它来配置 CORS。

例如,如果您只想允许从您的自定义域下载对象,请将这些数据放在名为 cors.json 的文件中(替换"https://example.com"为您的域):

[
  {
    "origin": ["https://example.com"],
    "method": ["GET"],
    "maxAgeSeconds": 3600
  }
]

然后,运行此命令(替换"exampleproject.appspot.com"为您的存储桶的名称):

gsutil cors set cors.json gs://exampleproject.appspot.com

你应该被设置。

如果您需要更复杂的 CORS 配置,请查看https://cloud.google.com/storage/docs/cross-origin#Configuring-CORS-on-a-Bucket上的文档。

以上内容现在也包含在有关CORS 配置的 Firebase 文档中

于 2016-06-11T15:22:32.047 回答
175

Google Cloud 现在有一个内联编辑器,可以让这个过程变得更简单。无需在本地系统上安装任何东西。

  1. 打开GCP 控制台>_并通过单击顶部导航栏中的图标按钮启动云终端会话。
  2. 单击铅笔图标打开编辑器,然后创建cors.json文件。
  3. gsutil cors set cors.json gs://your-bucket

在此处输入图像描述

于 2019-10-29T18:37:25.677 回答
22

只是想添加到答案。只需在 google 控制台 (console.cloud.google.com/home) 中转到您的项目并选择您的项目。打开终端并创建 cors.json 文件(touch cors.json),然后按照vim cors.json@frank-van-puffelen 的建议按照答案编辑此文件()

这对我有用。干杯!

于 2018-07-12T11:54:25.387 回答
2

另一种方法是使用 Google JSON API。第 1 步:获取与 JSON API 一起使用的访问令牌 要获取令牌使用,请访问:https ://developers.google.com/oauthplayground/ 然后搜索 JSON API 或存储 选择所需选项,即读取、写入、完整访问(勾选那些必填)按照流程获取访问令牌,有效期为一小时。第 2 步:使用令牌访问 google JSON API 以更新 CORS

样品卷曲:

    curl -X PATCH \
  'https://www.googleapis.com/storage/v1/b/your_bucket_id?fields=cors' \
  -H 'Accept: application/json' \
  -H 'Accept-Encoding: gzip, deflate' \
  -H 'Authorization: Bearer ya29.GltIB3rTqQ2tJgh0cMj1SEa1UgQNJnTMXUjMlMIRGG-mBCbiUO0wqdDuEpnPD6cbkcr1CuLItuhaNCTJYhv2ZKjK7yqyIHNgkCBup-T8Z1B1RiBrCgcgliHOGFDz' \
  -H 'Content-Type: application/json' \
  -H 'Postman-Token: d19f29ed-2e80-4c34-85ee-c46c9058fac0' \
  -H 'cache-control: no-cache' \
  -d '{
  "location": "us",
  "storageClass": "Standard",
  "cors": [
      {
          "maxAgeSeconds": "360000000",
          "method": [
             "GET",
             "HEAD",
             "DELETE"
          ],
          "origin": [
             "*"
          ],
          "responseHeader":[
            "Content-Type"
         ]
      }
  ]
}'
于 2019-07-17T02:30:14.153 回答