Ativando CORS em Cloud Functions para Firebase

No momento, estou aprendendo como usar as novas funções do Cloud para Firebase, e o problema que estou tendo é que não consigo acessar a function que escrevi por meio de uma solicitação AJAX. Eu recebo o erro “No ‘Access-Control-Allow-Origin'”. Aqui está um exemplo da function que escrevi:

exports.test = functions.https.onRequest((request, response) => { response.status(500).send({test: 'Testing functions'}); }) 

A function fica nesta URL: https://us-central1-fba-shipper-140ae.cloudfunctions.net/test

Os documentos do Firebase sugerem que você adicione o middleware CORS à function, mas 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. Adicionando ({origin: true}) corrigiu o problema, eu também tive que alterar response.status(500) para response.status(200) que eu perdi completamente no começo.

Existem duas funções de amostra fornecidas pela equipe do Firebase que demonstram o uso do CORS:

  • Servidor de horário com formatação de data
  • Terminal HTTPS que requer autenticação

O segundo exemplo usa uma maneira diferente de trabalhar com cors do que você está usando atualmente.

Além disso, considere importar assim, conforme mostrado nas amostras:

 const cors = require('cors')({origin: true}); 

Eu tenho um pequeno acréscimo a @Andreys para responder a sua própria pergunta.

Parece que você não precisa chamar o retorno de chamada na function cors(req, res, cb) , portanto, basta chamar o módulo cors na parte superior da function, sem incorporar todo o seu código no retorno de chamada. Isso é muito mais rápido se você quiser implementar cors depois.

 exports.exampleFunction = functions.https.onRequest((request, response) => { cors(request, response, () => {}); return response.send("Hello from Firebase!"); }); 

Não se esqueça de init cors como mencionado no post de abertura:

const cors = require('cors')({origin: true});

Uma informação adicional, apenas para aqueles que pesquisam isso depois de algum tempo: Se você estiver usando Firebase Hosting, você também pode configurar rewrite, de modo que, por exemplo, um URL como (firebase_hosting_host) / api / myfunction redireciona para o ( function firebase_cloudfunctions_host) / doStuff. Dessa forma, como o redirecionamento é transparente e no lado do servidor, você não precisa lidar com cors.

Você pode configurá-lo com uma seção de reconfigurações no firebase.json:

 "rewrites": [ { "source": "/api/myFunction", "function": "doStuff" } ] 

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 das funções do GCF / Firebase.

Espero que ajude!

Para quem está tentando fazer isso em Typescript, esse é o código:

 import * as cors from 'cors'; const corsHandler = cors({origin: true}); export const exampleFunction= functions.https.onRequest(async (request, response) => { corsHandler(request, response, () => {}); //Your code here }); 

Nenhuma solução de CORS funcionou para mim … até agora!

Não tenho certeza se alguém mais se deparou com o mesmo problema que eu fiz, mas eu configurei CORS como 5 maneiras diferentes de exemplos que encontrei e nada parecia funcionar. Eu configurei um exemplo mínimo com 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 informar alguma coisa. Eu tive alguns erros no código do servidor do meu nó , não relacionados ao CORS , que quando eu depurei liberou-me da minha mensagem de erro CORS . Eu não sei porque os erros de código não relacionados ao CORS retornam uma resposta de erro CORS, mas isso me levou ao buraco do coelho errado por um bom número de horas …

tl; dr – verificar seus logs de function do firebase se nenhuma solução CORS funcionar e depurar quaisquer erros que você tiver

Você pode definir o CORS na function cloud como este response.set('Access-Control-Allow-Origin', '*'); Não há necessidade de importar o pacote cors

Por que vale a pena eu estava tendo o mesmo problema ao passar o app para onRequest . Percebi que o problema era uma barra no URL de solicitação da function Firebase. O Express estava procurando por '/' mas eu não tinha a barra final na function [project-id].cloudfunctions.net/[function-name] . O erro CORS foi um falso negativo. Quando adicionei a barra final, obtive a resposta que esperava.