Activation des fonctions cors dans le Cloud pour Firebase

J'apprends actuellement à utiliser de nouvelles fonctions Cloud pour Firebase et le problème que j'ai est que je ne peux pas accéder à la fonction que j'ai écrite via une requête AJAX. Je reçois l'erreur " No 'Access-Control-Allow-Origin'". Voici un exemple de la fonction que j'ai écrite:

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

La fonction se trouve dans cette url: https://us-central1-fba-shipper-140ae.cloudfunctions.net/test

Firebase docs suggère d'ajouter un middleware CORS à l'intérieur de la fonction, je l'ai essayé mais ce n'est pas le cas de travail pour moi: https://firebase.google.com/docs/functions/http-events

Voici comment je l'ai fait:

var cors = require('cors');    

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

Ce que je fais mal? J'apprécierais toute aide à ce sujet.

Mise à jour:

La réponse de Doug Stevenson a aidé. L'ajout de ({origin: true}) a résolu le problème, j'ai également dû changer response.status(500) en response.status(200) ce que j'ai complètement manqué au début.

47
demandé sur Community 2017-03-13 04:01:10

8 réponses

Il existe deux Exemples de fonctions fournis par L'équipe Firebase qui démontrent l'utilisation de CORS:

Le deuxième exemple utilise une manière différente de travailler avec cors que vous utilisez actuellement.

Pensez également à importer comme ceci, comme indiqué dans les échantillons:

const cors = require('cors')({origin: true});
69
répondu Doug Stevenson 2017-03-13 04:27:20

J'ai un petit ajout à la réponse de @ Andreys à sa propre question.

Il semble que vous n'ayez pas à appeler le callback dans la fonction cors(req, res, cb), donc vous pouvez simplement appeler le module cors en haut de votre fonction, sans intégrer tout votre code dans le callback. C'est beaucoup plus rapide si vous voulez implémenter cors par la suite.

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

N'oubliez pas d'initialiser cors comme mentionné dans le post d'ouverture:

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

14
répondu Jaap Weijland 2018-01-17 12:17:09

Un élément d'information supplémentaire, juste pour le bien de ceux qui googlent cela après un certain temps: Si vous utilisez l'hébergement firebase, vous pouvez également configurer des réécritures, de sorte que par exemple une url comme (firebase_hosting_host)/api/myfunction redirige vers la fonction (firebase_cloudfunctions_host) / doStuff. De cette façon, puisque la redirection est transparente et côté serveur, vous n'avez pas à traiter avec cors.

Vous pouvez configurer cela avec une section réécriture dans firebase.json:

"rewrites": [
        { "source": "/api/myFunction", "function": "doStuff" }
]
11
répondu Pablo Urquiza 2017-11-28 15:09:12

Pour quiconque essaie de le faire en Typescript, c'est le code:

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
});
8
répondu Yayo Arellano 2018-06-22 16:29:15

Je viens de publier un petit article à ce sujet:

Https://mhaligowski.github.io/blog/2017/03/10/cors-in-cloud-functions.html

Généralement, vous devez utiliser Express cors package , ce qui nécessite un peu de piratage pour répondre aux exigences des fonctions GCF/Firebase.

J'espère que ça aide!

6
répondu mhaligowski 2017-03-13 05:13:49

Vous pouvez définir le CORS dans la fonction cloud comme ceci response.set('Access-Control-Allow-Origin', '*'); pas besoin d'importer le paquet cors

4
répondu deanwilliammills 2018-08-19 23:10:32

Aucune solution CORS n'a fonctionné pour moi... jusqu'à maintenant!

Je ne sais pas si quelqu'un d'autre a rencontré le même problème que moi, mais j'ai mis en place CORS comme 5 façons différentes à partir d'exemples que j'ai trouvés et rien ne semblait fonctionner. J'ai mis en place un exemple minimal avec Plunker pour voir si c'était vraiment un bug, mais l'exemple a fonctionné magnifiquement. J'ai décidé de vérifier les journaux des fonctions firebase (trouvés dans la console firebase) pour voir si cela pouvait me dire quelque chose. j'ai eu quelques erreurs dans le code de mon serveur de nœud , pas lié CORS , que lorsque j'ai débogué m'a libéré de mon message D'erreur CORS. Je ne sais pas pourquoi les erreurs de code sans rapport avec CORS renvoient une réponse d'erreur CORS, mais cela m'a conduit dans le mauvais trou de lapin pendant un bon nombre d'heures...

Tl; dr-vérifiez vos journaux de fonction firebase si aucune solution CORS ne fonctionne et déboguez les errros que vous avez

2
répondu tbone849 2018-06-29 14:02:22

Pour ce que ça vaut, j'avais le même problème en passant app dans onRequest. J'ai réalisé que le problème était une barre oblique finale sur l'url de la requête pour la fonction firebase. Express cherchait '/' mais je n'avais pas la barre oblique finale sur la fonction [project-id].cloudfunctions.net/[function-name]. L'erreur CORS était un faux négatif. Quand j'ai ajouté la barre oblique de fin, j'ai eu la réponse que j'attendais.

0
répondu shadyhill 2018-08-21 16:15:45