Pamięć Firebase i kontrola dostępu-Allow-Origin


86

Próbuję pobrać pliki z magazynu Firebase za pośrednictwem XMLHttpRequest, ale w zasobie nie ustawiono Access-Control-Allow-Origin, więc nie jest to możliwe. Czy istnieje sposób na ustawienie tego nagłówka na serwerze magazynu?

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

Komunikat o błędzie Chrome:

XMLHttpRequest nie może załadować https://firebasestorage.googleapis.com/[EDITED] Żądany zasób nie zawiera nagłówka „Access-Control-Allow-Origin”. Dlatego źródłohttp: // localhost: 3449 ” nie ma dostępu.


1
Za mało przedstawiciela na komentarz, ale powyższy sposób jest nadal właściwy. Chciałem tylko udostępnić oficjalne dokumenty
Firebase

Odpowiedzi:


172

Z tego posta w grupie / liście Firebase-Talk :

Najłatwiejszym sposobem skonfigurowania danych dla CORS jest użycie gsutilnarzędzia wiersza polecenia. Instrukcje instalacji gsutilsą dostępne pod adresem https://cloud.google.com/storage/docs/gsutil_install . Po zainstalowaniu gsutili uwierzytelnieniu za jego pomocą możesz go użyć do skonfigurowania CORS.

Na przykład, jeśli chcesz tylko zezwolić na pobieranie obiektów z domeny niestandardowej, umieść te dane w pliku o nazwie cors.json (zastępując "https://example.com"swoją domeną):

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

Następnie uruchom to polecenie (zastępując "exampleproject.appspot.com"nazwę swojego zasobnika):

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

i powinieneś być ustawiony.

Jeśli potrzebujesz bardziej skomplikowanej konfiguracji CORS, zapoznaj się z dokumentacją pod adresem https://cloud.google.com/storage/docs/cross-origin#Configuring-CORS-on-a-Bucket .


5
Czy istnieje sposób na zezwolenie na wszystkie źródła podobne do Access-Control-Allow-Origin: *?
dooderson

5
Jak mogę znaleźć dokładną nazwę mojego zasobnika Firebase?
Jim

11
@ user1311069 po prostu użyj "origin": ["*"],zamiast"origin": ["https://example.com"],
rigdonmr

8
Firebase naprawdę musi znaleźć przyjazny dla użytkownika sposób, aby to zrobić. Ustawianie uprawnień w rzeczywistej bazie danych Firebase nie jest aż tak frustrujące, ani też nie jest to ustawianie uprawnień do zasobnika S3. Silna preferencja dla S3 w tym momencie.
Matt Jensen,

43
Jeśli nie chcesz instalować narzędzia, wygodnym sposobem jest wejście na console.cloud.google.com/home i kliknięcie „Aktywuj Google Cloud Shell” w prawym górnym rogu. Spowoduje to otwarcie powłoki z już zainstalowanym programem gsutil i dostępem do projektów pamięci masowej Firebase. (w powłoce użyłem pico do stworzenia json, a następnie zrobiłem to, gsutil cors set myjson.json gs://projectname.appspot.comjak wspomniano powyżej)
Eindbaas

47

Google Cloud ma teraz wbudowany edytor, który jeszcze bardziej ułatwia ten proces. Nie musisz niczego instalować w systemie lokalnym.

  1. Otwórz konsolę GCP i rozpocznij sesję terminala w chmurze, klikając >_przycisk ikony na górnym pasku nawigacyjnym.
  2. Kliknij ikonę ołówka, aby otworzyć edytor, a następnie utwórz cors.jsonplik.
  3. Biegać gsutil cors set cors.json gs://your-bucket

wprowadź opis obrazu tutaj


Utknąłem w kroku 1. Proszę wyjaśnić „i rozpocząć sesję terminala w chmurze” Otwieram konsolę i nie widzę przycisku lub łącze do „Rozpocznij sesję terminala w chmurze”
fortesl

3
To ikona w prawym górnym rogu, która wygląda tak>_
JeffD23

Czy istnieje prosty sposób, aby najpierw pobrać istniejącą konfigurację cors w celu przywrócenia, jeśli to konieczne?
David

Próbowałem tego, ale nie zadziałało.
user683742

U mnie
zadziałało

18

Chcę tylko dodać do odpowiedzi. Po prostu przejdź do swojego projektu w konsoli Google (console.cloud.google.com/home) i wybierz swój projekt. Tam otwórz terminal i po prostu utwórz plik cors.json ( touch cors.json), a następnie postępuj zgodnie z odpowiedzią i edytuj ten plik ( vim cors.json) zgodnie z sugestią @ frank-van-puffelen

To zadziałało dla mnie. Twoje zdrowie!


Konsola internetowa na console.cloud.google.com/home dawała mi błąd, ale działała dobrze z Google Cloud SDK Shell.
FiringBlanks

3
... Tam otwierasz terminal i ... Jak otwierasz terminal? Nie widzę przycisku „Otwórz terminal” na linku
fortesl

Upewnij się, że jesteś w cloudsubdomenie, a nie w tej firebase(„console.cloud.google.com/home”) i poszukaj >_przycisku z ikoną w prawym górnym rogu.
Chris Villa

1

inną metodą jest użycie Google JSON API. krok 1: zdobądź token dostępu do użycia z JSON API Aby uzyskać token użyj wejdź na: https://developers.google.com/oauthplayground/ Następnie wyszukaj JSON API lub Storage Wybierz wymagane opcje, tj. odczyt, zapis, pełny_dostęp (zaznacz te które są wymagane) Postępuj zgodnie z procedurą, aby otrzymać Access Token, który będzie ważny przez godzinę. Krok 2: użyj tokena, aby trafić w Google JSON API, aby zaktualizować CORS

Przykładowe Curl:

    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

Chciałbym dodać dla tych, którzy rozpaczliwie potrzebują rozwiązania, tak jak ja po wypróbowaniu tego wszystkiego i nie rozwiązaniu problemu. Znalazłem świetny artykuł online oferujący 3 rozwiązania, a pierwszy zadziałał dla mnie… wtyczka Google Chrome… tak! ..

rozszerzenie moesif CORS Upewnij się, że po instalacji, włączysz go


2
To tak naprawdę nie rozwiązuje problemu nieznanego użytkownika w terenie - tylko dla jednej maszyny.
Elemental

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.