Atualmente, estou aprendendo a usar as novas funções de nuvem para Firebase e o problema que tenho é que não consigo acessar a função que escrevi por meio de uma solicitação AJAX. Eu recebo o erro "Não 'Acesso-controle-permitir-origem'". Aqui está um exemplo da função que escrevi:
exports.test = functions.https.onRequest((request, response) => {
response.status(500).send({test: 'Testing functions'});
})
A função fica neste URL: https://us-central1-fba-shipper-140ae.cloudfunctions.net/test
Os documentos do Firebase sugerem adicionar o middleware CORS dentro da função, eu tentei, mas não está funcionando para mim: https://firebase.google.com/docs/functions/http-events
Foi assim que eu fiz:
var cors = require('cors');
exports.test = functions.https.onRequest((request, response) => {
cors(request, response, () => {
response.status(500).send({test: 'Testing functions'});
})
})
O que estou fazendo de errado? Eu apreciaria qualquer ajuda com isso.
ATUALIZAR:
A resposta de Doug Stevenson ajudou. A adição ({origin: true}) corrigiu o problema. Também tive que mudar response.status(500)
para o response.status(200)
qual perdi completamente.
fonte
Respostas:
Existem duas funções de exemplo fornecidas pela equipe do Firebase que demonstram o uso do CORS:
O segundo exemplo usa uma maneira diferente de trabalhar com cors do que você está usando atualmente.
Além disso, considere importar desta forma, conforme mostrado nas amostras:
fonte
origin: true
de deixá-lo fora fará com que isso não trabalhoorigin: true
permite que qualquer domínio acesse? ( npmjs.com/package/cors ) @Doug Stevenson Você acha que o firebase poderia escrever um documento sobre o básico necessário para as funções https do cliente / servidor? O repositório de amostras é bom, mas perdemos esse requisito extra.Você pode definir o CORS na função de nuvem como esta
response.set('Access-Control-Allow-Origin', '*');
Não há necessidade de importar o
cors
pacotefonte
Authorization
cabeçalho. O texto acima parece funcionar bem.Para qualquer pessoa que tente fazer isso no TypeScript, este é o código:
fonte
Uma informação adicional, apenas para aqueles que pesquisam isso depois de algum tempo: Se você estiver usando hospedagem firebase, também poderá configurar reescritas, de modo que, por exemplo, um URL como (firebase_hosting_host) / api / myfunction seja redirecionado para o ( firebase_cloudfunctions_host) / função doStuff. Dessa forma, como o redirecionamento é transparente e do lado do servidor, você não precisa lidar com cors.
Você pode configurar isso com uma seção de reescritas no firebase.json:
fonte
Nenhuma solução CORS funcionou para mim ... até agora!
Não tenho certeza se mais alguém encontrou o mesmo problema que eu, mas configurei o CORS como 5 maneiras diferentes dos exemplos que encontrei e nada parecia funcionar. Eu configurei um exemplo mínimo com o Plunker para ver se era realmente um bug, mas o exemplo correu lindamente. Decidi verificar os logs de funções do firebase (encontrados no console do firebase) para ver se isso poderia me dizer alguma coisa. Eu tive alguns erros no código do servidor do nó , não relacionados ao CORS , que quando depurei, liberaram minha mensagem de erro do CORS . Eu não sei por que erros de código não relacionados ao CORS retornam uma resposta de erro do CORS, mas isso me levou à toca do coelho errada por um bom número de horas ...
tl; dr - verifique seus logs de função do firebase se nenhuma solução CORS funcionar e depure quaisquer erros que você tiver
fonte
Error: quota exceeded (Quota exceeded for quota group 'NetworkIngressNonbillable' and limit 'CLIENT_PROJECT-1d' of service 'cloudfunctions.googleapis.com
quota então basicamente livre foi excedido e funções retornou erro corosaccess to external network resources not allowed if the billing account is not enabled
. Depois de ativar a conta de cobrança, ela funciona perfeitamente. Este também é um dos exemplos não relacionados a cors, mas é gerado um erro de cors.Tenho um pequeno acréscimo à resposta do @Andreys à sua própria pergunta.
Parece que você não precisa chamar o retorno de chamada na
cors(req, res, cb)
função, portanto, basta chamar o módulo cors na parte superior da sua função, sem incorporar todo o seu código no retorno de chamada. Isso é muito mais rápido se você quiser implementar cors posteriormente.Não esqueça de iniciar cors como mencionado no post de abertura:
const cors = require('cors')({origin: true});
fonte
cors(request, response, () => { return response.send("Hello from Firebase!"); });
Isso pode ser útil. Criei a função de nuvem HTTP do firebase com express (URL personalizado)
Certifique-se de adicionar seções de reescrita
fonte
Acabei de publicar um pequeno artigo sobre isso:
https://mhaligowski.github.io/blog/2017/03/10/cors-in-cloud-functions.html
Geralmente, você deve usar o pacote Express CORS , que requer um pouco de hacking para atender aos requisitos do GCF / Firebase Functions.
Espero que ajude!
fonte
Se houver pessoas como eu por aí: Se você quiser chamar a função de nuvem do mesmo projeto que a função de nuvem, pode iniciar o firebase sdk e usar o método onCall. Ele vai lidar com tudo para você:
Chame esta função assim:
Documentos do Firebase: https://firebase.google.com/docs/functions/callable
Se você não pode iniciar o SDK, aqui está a essência das outras sugestões:
fonte
Foi encontrada uma maneira de habilitar cors sem importar nenhuma biblioteca 'cors'. Ele também funciona
Typescript
e o testou na versão 81.0 do Chrome.fonte
Pelo que vale a pena, eu estava tendo o mesmo problema ao passar
app
para oonRequest
. Percebi que o problema era uma barra no URL de solicitação para a função firebase. O Express estava procurando,'/'
mas eu não tinha a barra à direita na função[project-id].cloudfunctions.net/[function-name]
. O erro do CORS foi um falso negativo. Quando adicionei a barra final, recebi a resposta que estava esperando.fonte
[project-id]
como este foi o problema que enfrentamosSó assim funciona para mim, pois tenho autorização no meu pedido:
fonte
Se você não pode / não pode usar o plugin cors, chamando o
setCorsHeaders()
função logo na função manipulador também funcionará.Use também as funções respondSuccess / Error ao responder novamente.
fonte
Se você estiver testando o aplicativo firebase localmente, precisará apontar funções para em
localhost
vez de nuvem. Por padrão,firebase serve
oufirebase emulators:start
aponta as funções para o servidor, em vez do host local, quando você o usa no aplicativo da web.Adicione o script abaixo no cabeçalho html após o script init do firebase:
fonte
Alterar
true
por"*"
fez o truque para mim, então é assim que parece:Eu tentei essa abordagem porque, em geral, é assim que esse cabeçalho de resposta é definido:
Esteja ciente de que isso permitirá que qualquer domínio chame seus endpoints, portanto, NÃO é seguro.
Além disso, você pode ler mais sobre os documentos: https://github.com/expressjs/cors
fonte
Se você não estiver usando o Express ou simplesmente desejar usar o CORS. O código a seguir ajudará a resolver
fonte
No meu caso, o erro foi causado pelo acesso limitado ao invocador da função de nuvem. Adicione todos os usuários ao invocador da função de nuvem. Por favor, pegue o link . Consulte o artigo para obter mais informações
fonte
Se nenhuma das outras soluções funcionar, tente adicionar o endereço abaixo no início da chamada para ativar o redirecionamento CORS:
Código de amostra com solicitação JQuery AJAX:
fonte
Adicionando minha experiência. Passei horas tentando descobrir por que tive um erro de CORS.
Acontece que renomeei minha função de nuvem (a primeira vez que tentei após uma grande atualização).
Portanto, quando meu aplicativo firebase estava chamando a função de nuvem com um nome incorreto, ele deveria ter gerado um erro 404, não um erro CORS.
A correção do nome da função de nuvem no meu aplicativo firebase corrigiu o problema.
Preenchi um relatório de bug sobre isso aqui https://firebase.google.com/support/troubleshooter/report/bugs
fonte