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.

Blacksad
fonte
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 .

Frank van Puffelen
fonte
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

JeffD23
fonte
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!

Aakash
fonte
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"
         ]
      }
  ]
}'
nimesh makwana
fonte
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

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

Para acessar qualquer recurso com um cabeçalho CORS aplicado, você poderia usar um pequeno projeto que fiz em Golang para mim - https://proxify-cors.herokuapp.com/

Roshnet
fonte