Firebase Storage ve Access-Control-Allow-Origin


90

XMLHttpRequest aracılığıyla Firebase Storage'dan dosya indirmeye çalışıyorum, ancak Access-Control-Allow-Origin kaynakta ayarlanmadı, bu yüzden bu mümkün değil. Bu başlığı depolama sunucusunda ayarlamanın herhangi bir yolu var mı?

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

Chrome hata mesajı:

XMLHttpRequest https://firebasestorage.googleapis.com/[EDITED] yükleyemiyor İstenen kaynakta 'Access-Control-Allow-Origin' başlığı yok. Bu nedenle ' http: // localhost: 3449 ' kaynağına erişime izin verilmiyor.


1
Bir yorum için yeterli replik yok, ancak yukarıdaki yol yine de doğru yoldur. Resmi firebase belgelerini bununla paylaşmak istedim: firebase.google.com/docs/storage/web/…
Andrew McOlash

Yanıtlar:


179

Bundan Firebase konuşma grup / listedeki yazı :

Verilerinizi CORS için yapılandırmanın en kolay yolu gsutilkomut satırı aracını kullanmaktır. Kurulum talimatları https://cloud.google.com/storage/docs/gsutil_install adresindegsutil mevcuttur . Yükledikten ve kimliğini doğruladıktan sonra, CORS'u yapılandırmak için kullanabilirsiniz.gsutil

Örneğin, yalnızca özel etki alanınızdan nesne indirmelerine izin vermek istiyorsanız, bu verileri cors.json adlı bir dosyaya koyun ( "https://example.com"etki alanınızla değiştirin ):

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

Ardından, şu komutu çalıştırın (paketinizin "exampleproject.appspot.com"adıyla değiştirin ):

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

ve hazır olmalısın.

Daha karmaşık bir CORS yapılandırmasına ihtiyacınız varsa, https://cloud.google.com/storage/docs/cross-origin#Configuring-CORS-on-a-Bucket adresindeki belgelere bakın .


5
Access-Control-Allow-Origin: * ile benzer tüm kaynaklara izin vermenin bir yolu var mı?
dooderson

5
Firebase kovamın tam adını nasıl bulabilirim?
Jim

11
@ user1311069 "origin": ["*"],yerine kullanın"origin": ["https://example.com"],
rigdonmr

8
Firebase'in bunu yapmanın gerçekten kullanıcı dostu bir yolunu bulması gerekiyor. Gerçek bir Firebase veritabanında izin ayarlamak neredeyse bu kadar sinir bozucu değildir ve S3 klasör izinlerini ayarlamak da değildir. Bu noktada S3 için güçlü tercih.
Matt Jensen

44
Kullanımı yüklemek istemiyorsanız, kullanışlı bir yol console.cloud.google.com/home adresine gidip sağ üstteki "Google Cloud Shell'i Etkinleştir" i tıklamaktır. Bu, gsutil'in zaten kurulu olduğu ve firebase depolama projelerinize erişimi olan bir kabuk açacaktır. (kabukta bir json oluşturmak için pico kullandım, sonra gsutil cors set myjson.json gs://projectname.appspot.comyukarıda belirtildiği gibi yaptım )
Eindbaas

62

Google Cloud, bu işlemi daha da kolaylaştırmak için artık bir satır içi düzenleyiciye sahip. Yerel sisteminize herhangi bir şey yüklemenize gerek yok.

  1. GCP konsolunu açın ve >_üstteki gezinme çubuğundaki simge düğmesini tıklayarak bir bulut terminal oturumu başlatın .
  2. Düzenleyiciyi açmak için kalem simgesini tıklayın, ardından cors.jsondosyayı oluşturun.
  3. Çalıştırmak gsutil cors set cors.json gs://your-bucket

görüntü açıklamasını buraya girin


1. adımda
takılı kaldık

3
Sağ üst gezinme bölmesindeki simgeye benziyor>_
JeffD23

Gerekirse eski haline döndürmek için önce mevcut cors yapılandırmasını çekmenin basit bir yolu var mı?
David

Hile yaptım! teşekkür ederim. Söylemeliyim ki, bu, belki de kurallara göre, firebase depolamasının kendisinden kontrol edilseydi çok daha kolay olabilirdi ?! #google #firebase, burada kullanıcı deneyimini geliştirmek için bir fırsat var.
Rodrigo Rubio

1
@NickCarducci haklı olabilirsin ve anonim tesisi gerçekten seviyorum, ancak bellekten 10 milyonluk bir sınıra sahip olduğundan endişeleniyor. Bu, örneğin hiç kimsenin oturum açmasının veya kaydolmasının beklenmediği bir TV kampanyası için web uygulamanız olduğunda tehlikeli olabilir.
Rodrigo Rubio

18

Sadece cevaba eklemek istiyorum. Google konsolunda (console.cloud.google.com/home) projenize gidin ve projenizi seçin. Orada terminali açın ve sadece cors.json dosyasını ( touch cors.json) oluşturun ve ardından cevabı takip edin ve vim cors.json@ frank-van-puffelen tarafından önerildiği gibi bu dosyayı ( ) düzenleyin

Bu benim için çalıştı. Şerefe!


Console.cloud.google.com/home adresindeki web konsolu bana bir hata veriyordu, ancak Google Cloud SDK Shell ile sorunsuz çalıştı.
FiringBlanks

3
... Orada terminali açın ve ... Terminali nasıl açarsınız? Bağlantıda "Terminali aç" düğmesi
görmüyorum

1
cloudAlt alan adında olduğunuzdan emin olun firebase("console.cloud.google.com/home") ve >_sağ üstteki simge düğmesini arayın .
Chris Villa

1

bunu yapmak için başka bir yaklaşım Google JSON API kullanmaktır. 1. adım: JSON API ile kullanmak üzere erişim jetonu alın Bir jeton kullanmak için şu adrese gidin: https://developers.google.com/oauthplayground/ Ardından JSON API veya Depolama için arama yapın Gerekli seçenekleri seçin, ör. okuma, yazma, tam_ erişim (bunları işaretleyin Bir saat geçerli olacak Erişim Jetonunu almak için süreci izleyin. 2. Adım: CORS'u güncellemek üzere google JSON API'ye ulaşmak için jeton kullanın

Örnek Kıvrılma:

    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

Bütün bunları denedikten sonra olduğu gibi çaresiz bir çözüme ihtiyaç duyan ve sorunu çözmeyenleri eklemek isterim. İnternette 3 çözüm sunan harika bir makale buldum ve ilki benim için çalıştı .. bir google chrome eklentisi .. evet! ..

moesif CORS uzantısı Yükledikten sonra AÇIK duruma getirdiğinizden emin olun


2
Bu, sahadaki bilinmeyen kullanıcı için sorunu gerçekten çözmez - yalnızca tek bir makine için.
Elemental

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.