FirebaseストレージとAccess-Control-Allow-Origin


90

XMLHttpRequestを介してFirebaseStorageからファイルをダウンロードしようとしていますが、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)))

Chromeのエラーメッセージ:

XMLHttpRequestはhttps://firebasestorage.googleapis.com/[EDITED]を読み込め ません。要求されたリソースに「Access-Control-Allow-Origin」ヘッダーがありません。したがって、オリジン ' http:// localhost:3449 'はアクセスを許可されていません。


1
コメントには十分な担当者がいませんが、上記の方法は依然として正しい方法です。ちょうどこの1の公式firebaseドキュメントを共有したいと思った:firebase.google.com/docs/storage/web/...
アンドリューMcOlash

回答:


179

firebase-talkグループ/リストのこの投稿から:

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#Configure-CORS-on-a-Bucketのドキュメントを確認してください


5
Access-Control-Allow-Originと同様にすべてのオリジンを許可する方法はありますか?*?
dooderson 2016年

5
Firebaseバケットの正確な名前を見つけるにはどうすればよいですか?
ジム

11
@ user1311069の"origin": ["*"],代わりに使用する"origin": ["https://example.com"],
rigdonmr 2017年

8
Firebaseは、これを行うためのユーザーフレンドリーな方法を実際に理解する必要があります。実際のFirebaseデータベースに権限を設定することは、これほどイライラすることではなく、S3バケットの権限を設定することでもありません。現時点ではS3を強く好みます。
マットジェンセン

44
utilをインストールしたくない場合は、console.cloud.google.com / homeにアクセスして、右上の[Activate Google CloudShell ]をクリックすると便利です。これにより、gsutilが既にインストールされており、Firebaseストレージプロジェクトにアクセスできるシェルが開きます。(シェルでは、picoを使用してjsonを作成し、gsutil cors set myjson.json gs://projectname.appspot.com上記のように実行しました)
Eindbaas 2017

62

Google Cloudには、このプロセスをさらに簡単にするインラインエディタが追加されました。ローカルシステムに何もインストールする必要はありません。

  1. GCPコンソールを開き、>_上部のナビゲーションバーにあるアイコンボタンをクリックしてクラウドターミナルセッションを開始します。
  2. 鉛筆アイコンをクリックしてエディターを開き、cors.jsonファイルを作成します。
  3. 実行 gsutil cors set cors.json gs://your-bucket

ここに画像の説明を入力してください


ステップ1の説明「とクラウド端末セッション開始」私はコンソールを開きをし、「クラウド端末セッションを開始」へのボタン、またはリンクをご覧くださいで立ち往生
fortesl

3
右上のナビゲーションにあるアイコンは次のようになります>_
JeffD 2319年

必要に応じて、既存のcors構成を最初にプルして元に戻す簡単な方法はありますか?
デビッド

トリックをしました!ありがとうございました。おそらくルールの下で、Firebaseストレージ自体から制御されていれば、これははるかに簡単になる可能性があります。#google#firebaseユーザーエクスペリエンスを向上させる機会がここにあります。
ロドリゴルビオ

1
@NickCarducciあなたは正しいかもしれません、そして私は匿名の機能が本当に好きです、しかしそれはそれがメモリから1000万の厳しい制限を持っていることを心配しています。これは、TVキャンペーン用のWebアプリがある場合、たとえば、誰もサインインまたは登録することが期待されていない場合に危険になる可能性があります。
ロドリゴルビオ

18

答えに追加したいだけです。Googleコンソール(console.cloud.google.com/home)でプロジェクトに移動し、プロジェクトを選択するだけです。そこでターミナルを開き、cors.jsonファイル(touch cors.json)を作成し、答えに従って、vim cors.json@ frank-van-puffelenの提案に従ってこのファイル()を編集します。

これは私のために働いた。乾杯!


console.cloud.google.com/homeのウェブコンソールでエラーが発生しましたが、Google Cloud SDKShellでは正常に機能しました。
FiringBlanks

3
...そこでターミナルを開きます...どのようにターミナルを開きますか?私はリンクの上に何の「オープンターミナル」ボタンが表示されない
fortesl

1
cloudサブドメインfirebase( "console.cloud.google.com/home")ではなく、サブドメインにいることを確認>_し、右上のアイコンボタンを探します。
クリスヴィラ

1

これを行う別のアプローチは、Google JSONAPIを使用することです。ステップ1:JSON APIで使用するアクセストークンを取得するトークンの使用を取得するには、https: //developers.google.com/oauthplayground/にアクセスします。次にJSON APIまたはストレージを検索します。必要なオプションを選択します。必須)プロセスに従ってアクセストークンを取得します。アクセストークンは1時間有効です。ステップ2:トークンを使用してGoogle JSONAPIをヒットして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"
         ]
      }
  ]
}'

0

私がこれらすべてを試した後、問題を解決しなかったような解決策を切実に必要としている人々のために追加したいと思います。私は3つの解決策を提供する素晴らしい記事をオンラインで見つけました、そして最初のものは私のために働きました..グーグルクロームプラグイン..うん!..

moesif CORS拡張機能 インストール後、必ずオンにしてください


2
これは、現場にいる未知のユーザーの問題を実際には解決しません。単一のマシンの場合のみです。
エレメンタル

0

適用されるヘッダCORSを持つ任意のリソースにアクセスするには、あなたは私が自分のためにGolangで作られた小さなプロジェクトを使用することができます- https://proxify-cors.herokuapp.com/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.