Firebase Storage e Access-Control-Allow-Origin


90

Estou tentando baixar arquivos do Firebase Storage por meio de um XMLHttpRequest, mas Access-Control-Allow-Origin não está definido no recurso, portanto, não é possível. Existe alguma maneira de definir este cabeçalho no servidor de armazenamento?

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

Mensagem de erro do Chrome:

XMLHttpRequest não pode carregar https://firebasestorage.googleapis.com/[EDITED] Nenhum cabeçalho 'Access-Control-Allow-Origin' está presente no recurso solicitado. Portanto, o acesso de origem ' http: // localhost: 3449 ' não é permitido.


1
Não há representação suficiente para um comentário, mas o método acima ainda é o correto. Só queria compartilhar os documentos oficiais do firebase sobre este: firebase.google.com/docs/storage/web/…
Andrew McOlash

Respostas:


179

Desta postagem no firebase-talk group / list :

A maneira mais fácil de configurar seus dados para CORS é com a gsutilferramenta de linha de comando. As instruções de instalação do gsutilestão disponíveis em https://cloud.google.com/storage/docs/gsutil_install . Depois de instalargsutil e autenticar com ele, você pode usá-lo para configurar o CORS.

Por exemplo, se você deseja apenas permitir downloads de objetos de seu domínio personalizado, coloque esses dados em um arquivo denominado cors.json (substituindo "https://example.com"por seu domínio):

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

Em seguida, execute este comando (substituindo "exampleproject.appspot.com"pelo nome do seu intervalo):

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

e você deve ser definido.

Se você precisar de uma configuração CORS mais complicada, verifique os documentos em https://cloud.google.com/storage/docs/cross-origin#Configuring-CORS-on-a-Bucket .


5
Existe uma maneira de permitir todas as origens semelhantes a Access-Control-Allow-Origin: *?
dooderson

5
Como posso encontrar o nome exato do meu intervalo do Firebase?
Jim

11
@ user1311069 apenas use em "origin": ["*"],vez de"origin": ["https://example.com"],
rigdonmr

8
O Firebase realmente precisa descobrir uma maneira amigável de fazer isso. Definir permissões em um banco de dados Firebase real não é tão frustrante, nem definir permissões de bucket do S3. Forte preferência por S3 neste momento.
Matt Jensen

44
Se você não quiser instalar o utilitário, uma maneira prática é acessar console.cloud.google.com/home e clicar em “Ativar Google Cloud Shell” no canto superior direito. Isso abrirá um shell com o gsutil já instalado e com acesso aos seus projetos de armazenamento do Firebase. (no shell eu usei o pico para criar um json, então fiz gsutil cors set myjson.json gs://projectname.appspot.comcomo mencionado acima)
Eindbaas

62

O Google Cloud agora tem um editor embutido para tornar esse processo ainda mais fácil. Não há necessidade de instalar nada em seu sistema local.

  1. Abra o console do GCP e inicie uma sessão de terminal em nuvem clicando no botão do >_ícone na barra de navegação superior.
  2. Clique no ícone de lápis para abrir o editor e, em seguida, crie o cors.jsonarquivo.
  3. Corre gsutil cors set cors.json gs://your-bucket

insira a descrição da imagem aqui


Preso na etapa 1. Explique "e inicie uma sessão de terminal em nuvem" Eu abro o console e não vejo nenhum botão ou link para "iniciar uma sessão de terminal em nuvem"
fortesl

3
É o ícone no >_
painel de

Existe uma maneira direta de puxar a configuração do cors existente primeiro para reversão, se necessário?
David

Fez o truque! obrigado. Devo dizer que isso poderia ser muito mais simples se fosse controlado a partir do próprio armazenamento firebase, sob regras, talvez ?! #google #firebase existe uma oportunidade aqui para aprimorar a experiência do usuário.
Rodrigo Rubio

1
@NickCarducci você pode estar certo e eu realmente gosto da facilidade anônima, embora preocupe que tenha um limite rígido de 10 milhões de memória. Isso pode ser perigoso quando você tem um aplicativo da web para uma campanha de TV, por exemplo, onde ninguém deve fazer login ou se registrar.
Rodrigo Rubio

18

Só quero acrescentar algo à resposta. Basta acessar seu projeto no console do google (console.cloud.google.com/home) e selecionar seu projeto. Aí abra o terminal e apenas crie o arquivo cors.json ( touch cors.json) e então siga a resposta e edite este arquivo ( vim cors.json) conforme sugerido por @ frank-van-puffelen

Isso funcionou para mim. Felicidades!


O console da web em console.cloud.google.com/home estava apresentando um erro, mas funcionou bem com o Google Cloud SDK Shell.
FiringBlanks

3
... Aí abra o terminal e ... Como você abre o terminal? Não vejo o botão "Abrir terminal" no link
fortesl

1
Certifique-se de estar no cloudsubdomínio, não no subdomínio firebase("console.cloud.google.com/home") e procure o >_botão do ícone no canto superior direito.
Chris Villa

1

outra abordagem para fazer isso é usar a API JSON do Google. etapa 1: obter token de acesso para usar com a API JSON Para obter um token de uso, vá para: https://developers.google.com/oauthplayground/ Em seguida, pesquise por API JSON ou armazenamento Selecione as opções necessárias, ou seja, ler, gravar, full_access (marque essas que são obrigatórios) Siga o processo para obter o Token de Acesso, que será válido por uma hora. Etapa 2: use o token para acessar a API JSON do google para atualizar o CORS

Amostra de onda:

    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

Gostaria de acrescentar para aqueles que precisam desesperadamente de uma solução como eu estava depois de tentar tudo isso e não resolver o problema. Encontrei um ótimo artigo online que oferece 3 soluções, e a primeira funcionou para mim .. um plugin do Google Chrome .. sim! ..

extensão moesif CORS Certifique-se de ligá-la após a instalação


2
Isso realmente não resolve o problema do usuário desconhecido em campo - apenas para uma única máquina.
Elemental de

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.