J'apprends actuellement à utiliser les nouvelles fonctions Cloud pour Firebase et le problème que je rencontre est que je ne peux pas accéder à la fonction que j'ai écrite via une requête AJAX. J'obtiens 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
La documentation Firebase suggère d'ajouter le middleware CORS à l'intérieur de la fonction, je l'ai essayé mais cela ne fonctionne pas 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'});
})
})
Qu'est-ce que je fais mal? J'apprécierais n'importe quelle aide avec ceci.
METTRE À JOUR:
La réponse de Doug Stevenson a aidé. Ajout ({origine: true}) fixe la question, j'ai eu aussi au changement response.status(500)
à response.status(200)
laquelle je complètement raté au début.
la source
Réponses:
Il existe deux exemples de fonctions fournis par l'équipe Firebase qui illustrent l'utilisation de CORS:
Le deuxième exemple utilise une manière de travailler avec des cors différente de celle que vous utilisez actuellement.
Pensez également à importer comme ceci, comme indiqué dans les exemples:
la source
origin: true
le laisser de côté, cela ne fonctionnera pasorigin: true
permet à n'importe quel domaine d'accéder? ( npmjs.com/package/cors ) @Doug Stevenson Pensez-vous que Firebase pourrait rédiger un document sur les bases nécessaires pour les fonctions https client / serveur? Le repo d'échantillons est bon, mais nous avions manqué ce petit supplément d'exigence.Vous pouvez définir le CORS dans la fonction cloud comme ceci
response.set('Access-Control-Allow-Origin', '*');
Pas besoin d'importer le
cors
packagela source
Authorization
tête. Ce qui précède semble fonctionner correctement.Pour tous ceux qui essaient de faire cela dans Typescript, voici le code:
la source
Une information supplémentaire, juste pour le plaisir de ceux qui recherchent ceci 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 le ( firebase_cloudfunctions_host) / doStuff. De cette façon, puisque la redirection est transparente et côté serveur, vous n'avez pas à gérer les cors.
Vous pouvez configurer cela avec une section de réécriture dans firebase.json:
la source
Aucune solution CORS n'a fonctionné pour moi ... jusqu'à présent!
Je ne sais pas si quelqu'un d'autre a rencontré le même problème que moi, mais j'ai configuré CORS comme 5 manières 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 s'il s'agissait vraiment d'un bogue, mais l'exemple a fonctionné à merveille. J'ai décidé de vérifier les journaux des fonctions de 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 , non liées à CORS , qui, lorsque j'ai débogué, m'ont libéré de mon message d'erreur CORS . Je ne sais pas pourquoi les erreurs de code non liées à CORS renvoient une réponse d'erreur CORS, mais cela m'a conduit dans le mauvais terrier pendant un bon nombre d'heures ...
tl; dr - vérifiez vos journaux de fonctions Firebase si aucune solution CORS ne fonctionne et déboguez toutes les erreurs que vous avez
la source
Error: quota exceeded (Quota exceeded for quota group 'NetworkIngressNonbillable' and limit 'CLIENT_PROJECT-1d' of service 'cloudfunctions.googleapis.com
tellement fondamentalement le quota gratuit a été dépassé et les fonctions ont renvoyé une erreur de corsaccess to external network resources not allowed if the billing account is not enabled
. Après avoir activé le compte de facturation, cela fonctionne parfaitement. C'est également l'un des exemples non liés aux cors, mais une erreur cors est générée.J'ai un petit ajout à la réponse de @Andreys à sa propre question.
Il semble que vous n'ayez pas à appeler le rappel dans la
cors(req, res, cb)
fonction, vous pouvez donc simplement appeler le module cors en haut de votre fonction, sans incorporer tout votre code dans le rappel. C'est beaucoup plus rapide si vous souhaitez implémenter des cors par la suite.N'oubliez pas d'initier les cors comme mentionné dans le post d'ouverture:
const cors = require('cors')({origin: true});
la source
cors(request, response, () => { return response.send("Hello from Firebase!"); });
Cela pourrait être utile. J'ai créé la fonction cloud HTTP Firebase avec express (URL personnalisée)
Veuillez vous assurer d'avoir ajouté des sections de réécriture
la source
Je viens de publier un petit article à ce sujet:
https://mhaligowski.github.io/blog/2017/03/10/cors-in-cloud-functions.html
En règle générale, vous devez utiliser le package Express CORS , qui nécessite un peu de piratage pour répondre aux exigences des fonctions GCF / Firebase.
J'espère que cela pourra aider!
la source
S'il y a des gens comme moi là-bas: Si vous voulez appeler la fonction cloud à partir du même projet que la fonction cloud elle-même, vous pouvez lancer le sdk firebase et utiliser la méthode onCall. Il s'occupera de tout pour vous:
Appelez cette fonction comme ceci:
Documentation Firebase: https://firebase.google.com/docs/functions/callable
Si vous ne pouvez pas lancer le SDK, voici l'essence des autres suggestions:
la source
Nous avons trouvé un moyen d'activer les cors sans importer de bibliothèque «cors». Il fonctionne également avec
Typescript
et l'a testé dans la version chrome 81.0.la source
Pour ce que ça vaut la peine que je faisais le même problème lors du passage
app
dansonRequest
. J'ai réalisé que le problème était une barre oblique à la fin de 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. Lorsque j'ai ajouté la barre oblique finale, j'ai obtenu la réponse que j'attendais.la source
[project-id]
car c'était le problème auquel j'ai été confrontéSeulement cette façon fonctionne pour moi car j'ai une autorisation dans ma demande:
la source
Si vous n'utilisez pas / ne pouvez pas utiliser le plugin cors, appeler la
setCorsHeaders()
fonction en premier dans la fonction handler fonctionnera également.Utilisez également les fonctions respondSuccess / Error lorsque vous répondez.
la source
Si vous testez l'application Firebase localement, vous devez pointer les fonctions vers
localhost
plutôt que vers le cloud. Par défaut,firebase serve
oufirebase emulators:start
pointe les fonctions vers le serveur au lieu de l'hôte local lorsque vous l'utilisez sur votre application Web.Ajoutez le script ci-dessous dans la tête html après le script d'initialisation de firebase:
la source
Changer
true
par a"*"
fait l'affaire pour moi, voici à quoi ça ressemble:J'ai essayé cette approche car en général, voici comment cet en-tête de réponse est défini:
Sachez que cela permettra à n'importe quel domaine d'appeler vos points de terminaison, donc ce n'est PAS sécurisé.
De plus, vous pouvez en savoir plus sur la documentation: https://github.com/expressjs/cors
la source
Si vous n'utilisez pas Express ou souhaitez simplement utiliser CORS. Le code suivant aidera à résoudre
la source
Dans mon cas, l'erreur a été causée par l'accès à la limite de l'invocateur de la fonction cloud. Veuillez ajouter allUsers à l'invocateur de la fonction cloud. Veuillez attraper le lien . Veuillez vous référer à l' article pour plus d'informations
la source
Si aucune des autres solutions ne fonctionne, vous pouvez essayer d'ajouter l'adresse ci-dessous au début de l'appel pour activer CORS - redirection:
Exemple de code avec la requête JQuery AJAX:
la source
Ajout de mon expérience. J'ai passé des heures à essayer de trouver pourquoi j'avais une erreur CORS.
Il arrive que j'ai renommé ma fonction cloud (la toute première que j'essayais après une grosse mise à jour).
Ainsi, lorsque mon application Firebase appelait la fonction cloud avec un nom incorrect, elle aurait dû générer une erreur 404, pas une erreur CORS.
La correction du nom de la fonction cloud dans mon application Firebase a résolu le problème.
J'ai rempli un rapport de bogue à ce sujet ici https://firebase.google.com/support/troubleshooter/report/bugs
la source