Зберігання Firebase та контроль доступу-дозволу-походження


86

Я намагаюсь завантажити файли із сховища Firebase через XMLHttpRequest, але 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
Недостатньо представників для коментаря, але вищевказаний спосіб все-таки правильний. Просто хотів поділитися офіційними документами Firebase щодо цього: firebase.google.com/docs/storage/web/…
Ендрю МакОлаш,

Відповіді:


171

З цього допису в групі / списку 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#Configuring-CORS-on-a-Bucket .


5
Чи є спосіб дозволити всі джерела, подібні до Access-Control-Allow-Origin: *?
dooderson,

5
Як я можу знайти точну назву мого відра Firebase?
Джим

11
@ user1311069 просто використовуйте "origin": ["*"],замість"origin": ["https://example.com"],
rigdonmr

8
Firebase дійсно повинен з’ясувати зручний для цього спосіб. Встановлення дозволів для фактичної бази даних Firebase майже не засмучує, а також не встановлює дозволи на сегмент S3. На даний момент сильна перевага для S3.
Matt Jensen

43
Якщо ви не хочете встановлювати утиліт, зручним способом є перейти на console.cloud.google.com/home і натиснути кнопку «Активувати Google Cloud Shell» у верхньому правому куті. Це відкриє оболонку з уже встановленим gsutil та з доступом до ваших проектів зберігання у firebase. (в оболонці я використовував pico для створення json, а потім зробив те gsutil cors set myjson.json gs://projectname.appspot.com, що було згадано вище)
Eindbaas

46

Тепер Google Cloud має вбудований редактор, щоб зробити цей процес ще простішим. Не потрібно нічого встановлювати у локальній системі.

  1. Відкрийте консоль GCP і запустіть сеанс хмарного терміналу, натиснувши кнопку >_значка у верхній панелі навігації.
  2. Клацніть піктограму олівця, щоб відкрити редактор, а потім створіть cors.jsonфайл.
  3. Біжи gsutil cors set cors.json gs://your-bucket

введіть тут опис зображення


Застряг на кроці 1. Будь ласка, поясніть "і розпочніть сеанс хмарного терміналу". Я відкриваю консоль і не бачу жодної кнопки, або посилання на "розпочати сеанс хмарного терміналу"
fortesl

3
Це виглядає піктограма у верхньому правому меню>_
JeffD23

Чи є прямий спосіб витягнути існуючу конфігурацію корсів спочатку для реверсії, якщо це необхідно?
Девід

Я спробував це, але це не спрацювало.
user683742

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 SDK.
FiringBlanks

3
... Відкрийте термінал і ... Як відкрити термінал? Я не бачу кнопки "Відкрити термінал" на посиланні
fortesl

Переконайтеся, що ви перебуваєте на cloudсубдомені, а не на firebaseцьому ("console.cloud.google.com/home") і знайдіть >_кнопку із значком у верхньому правому куті.
Кріс Вілла,

1

інший підхід для цього - використання Google JSON API. крок 1: отримати маркер доступу для використання з JSON API , щоб отримати маркер використання Перейти до: https://developers.google.com/oauthplayground/ Тоді пошуку JSON API або зберігання Виберіть необхідні параметри , тобто читання, запис, full_access (відзначте ті , необхідні) Виконайте процедуру, щоб отримати маркер доступу, який діятиме протягом години. Крок 2: Використовуйте маркер, щоб натиснути API JSON Google для оновлення 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 рішення, і перше працювало для мене .. плагін google chrome .. ага! ..

moesif розширення CORS Переконайтеся, що після встановлення ви вмикаєте його


2
Це насправді не вирішує проблему для невідомого користувача в полі - лише для однієї машини.
Елементал

0

Для доступу до будь-якого ресурсу із застосованим заголовком CORS ви можете скористатися невеликим проектом, який я зробив для себе в Голангу - https://proxify-cors.herokuapp.com/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.