ChatGPT解决这个技术问题 Extra ChatGPT

Firebase 存储和访问控制允许来源

我正在尝试通过 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”标头。因此,不允许访问 Origin 'http://localhost:3449'。

没有足够的代表发表评论,但上述方式仍然是正确的方式。只是想分享关于这个的官方 firebase 文档:firebase.google.com/docs/storage/web/…

u
undefined

从此post on the 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 设置 cors.json gs://exampleproject.appspot.com

你应该被设置。

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

以上内容现在也包含在 CORS Configuration 上的 Firebase 文档中


有没有办法允许所有类似于 Access-Control-Allow-Origin: * 的来源?
如何找到我的 Firebase 存储桶的确切名称?
@user1311069 只需使用 "origin": ["*"], 而不是 "origin": ["https://example.com"],
Firebase 确实需要找出一种用户友好的方式来做到这一点。在实际的 Firebase 数据库上设置权限并没有那么令人沮丧,设置 S3 存储桶权限也没有。目前对 S3 的强烈偏好。
如果您不想安装该实用程序,一个方便的方法是转到 console.cloud.google.com/home 并单击右上角的“激活 Google Cloud Shell”。这将打开一个已安装 gsutil 的 shell,并可以访问您的 firebase 存储项目。 (在外壳中我使用 pico 创建了一个 json,然后按照上面提到的 gsutil cors set myjson.json gs://projectname.appspot.com 做了)
J
JeffD23

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

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

https://i.stack.imgur.com/8ZlQ7.png


它是右上角导航中的图标,看起来像 >_
如有必要,是否有一种直接的方法可以先提取现有的 cors 配置以进行还原?
成功了!谢谢你。我必须说,如果它是从 Firebase 存储本身控制的,这可能会简单得多,也许是根据规则?! #google #firebase 有机会提升用户体验。
@NickCarducci 你可能是对的,我真的很喜欢匿名设施,尽管它担心它的内存硬限制是 1000 万。当您有一个用于电视广告系列的网络应用程序时,这可能会很危险,例如,预计没有人会登录或注册。
是否需要等待时间?我将原点设置为“*”,但它仍然抱怨从原点“https://....stackblitz.io”获取在“firebasestorage.googleapis.com...”处的访问权限已被 CORS 策略阻止:没有“访问控制” -允许来源'
A
Aakash

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

这对我有用。干杯!


console.cloud.google.com/home 上的网络控制台给了我一个错误,但在 Google Cloud SDK Shell 上运行良好。
...打开终端,然后...您如何打开终端?我在链接上看不到“打开终端”按钮
确保您位于 cloud 子域,而不是 firebase 子域(“console.cloud.google.com/home”)并在右上角查找 >_ 图标按钮。
n
nimesh makwana

另一种方法是使用 Google JSON API。第 1 步:获取访问令牌以与 JSON API 一起使用 要获取令牌使用,请转到:https://developers.google.com/oauthplayground/ 然后搜索 JSON API 或存储 选择所需选项,即读取、写入、full_access(勾选所需的选项)按照流程获取访问令牌,有效期为一小时。第 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"
         ]
      }
  ]
}'

A
Alex Joslin

我正在开发一个使用 firebase 存储的项目,最终用户需要一种方法来下载他们上传的文件。当用户尝试下载文件时,我遇到了一个 cors 错误,但经过一些研究,我解决了这个问题。这是我的想法:

下载 Google Cloud CLI 使用 CLI 在项目目录中创建 cors.json 文件登录并键入以下代码。

[
  {
    "origin": ["*"],
    "method": ["GET"],
    "maxAgeSeconds": 3600
  }
]

使用 Google Cloud CLI 导航到包含 cors.json 的目录 在 CLI 中键入:gsutil cors set cors.json gs://.appspot.com