Ich lerne gerade, wie man neue Cloud-Funktionen für Firebase verwendet, und das Problem ist, dass ich nicht auf die Funktion zugreifen kann, die ich über eine AJAX-Anfrage geschrieben habe. Ich erhalte den Fehler "No 'Access-Control-Allow-Origin'". Hier ist ein Beispiel für die Funktion, die ich geschrieben habe:
exports.test = functions.https.onRequest((request, response) => {
response.status(500).send({test: 'Testing functions'});
})
Die Funktion befindet sich in dieser URL: https://us-central1-fba-shipper-140ae.cloudfunctions.net/test
In den Firebase-Dokumenten wird vorgeschlagen, CORS-Middleware in die Funktion aufzunehmen. Ich habe es versucht, aber es funktioniert bei mir nicht: https://firebase.google.com/docs/functions/http-events
So habe ich es gemacht:
var cors = require('cors');
exports.test = functions.https.onRequest((request, response) => {
cors(request, response, () => {
response.status(500).send({test: 'Testing functions'});
})
})
Was mache ich falsch? Ich würde mich über jede Hilfe freuen.
AKTUALISIEREN:
Doug Stevensons Antwort half. Durch Hinzufügen von ({origin: true}) wurde das Problem behoben. Ich musste auch wechseln response.status(500)
, response.status(200)
was ich zunächst komplett verpasst hatte.
quelle
Antworten:
Das Firebase-Team stellt zwei Beispielfunktionen zur Verfügung, die die Verwendung von CORS demonstrieren:
Im zweiten Beispiel wird anders mit Cors gearbeitet als derzeit.
Ziehen Sie auch in Betracht, wie folgt zu importieren, wie in den Beispielen gezeigt:
quelle
origin: true
da das Weglassen dazu führen wird, dass dies nicht funktioniertorigin: true
ermöglicht es jeder Domain, darauf zuzugreifen? ( npmjs.com/package/cors ) @Doug Stevenson Glaubst du, Firebase könnte ein Dokument über die Grundlagen schreiben, die für Client / Server-https-Funktionen benötigt werden? Das Samples Repo ist gut, aber wir hatten dieses zusätzliche Bedürfnis verpasst.Sie können das CORS in der Cloud-Funktion wie folgt einstellen
response.set('Access-Control-Allow-Origin', '*');
Das
cors
Paket muss nicht importiert werdenquelle
Authorization
Header hinzufügen müssen . Das obige scheint in Ordnung zu funktionieren.Für alle, die dies in Typescript versuchen, ist dies der Code:
quelle
Eine zusätzliche Information, nur um dies nach einiger Zeit zu googeln: Wenn Sie Firebase-Hosting verwenden, können Sie auch Umschreibungen einrichten, sodass beispielsweise eine URL wie (firebase_hosting_host) / api / myfunction zu ( firebase_cloudfunctions_host) / doStuff-Funktion. Auf diese Weise müssen Sie sich nicht mit cors befassen, da die Umleitung transparent und serverseitig ist.
Sie können dies mit einem Umschreibeabschnitt in firebase.json einrichten:
quelle
Bei mir haben keine CORS-Lösungen funktioniert ... bis jetzt!
Ich bin mir nicht sicher, ob jemand anderes auf dasselbe Problem gestoßen ist wie ich, aber ich habe CORS auf fünf verschiedene Arten eingerichtet, anhand von Beispielen, die ich gefunden habe, und nichts schien zu funktionieren. Ich habe mit Plunker ein minimales Beispiel erstellt, um zu sehen, ob es wirklich ein Fehler war, aber das Beispiel lief wunderbar. Ich beschloss, die Firebase-Funktionsprotokolle (in der Firebase-Konsole) zu überprüfen, um festzustellen, ob mir das etwas sagen könnte. Ich hatte ein paar Fehler in meinem Knotenservercode , die nicht mit CORS zusammenhängen , und die mich beim Debuggen von meiner CORS-Fehlermeldung befreit haben . Ich weiß nicht, warum Codefehler, die nichts mit CORS zu tun haben, eine CORS-Fehlerantwort zurückgeben, aber sie haben mich eine gute Anzahl von Stunden lang in das falsche Kaninchenloch geführt ...
tl; dr - Überprüfen Sie Ihre Firebase-Funktionsprotokolle, wenn keine CORS-Lösungen funktionieren, und debuggen Sie eventuelle Fehler
quelle
Error: quota exceeded (Quota exceeded for quota group 'NetworkIngressNonbillable' and limit 'CLIENT_PROJECT-1d' of service 'cloudfunctions.googleapis.com
so im Grunde freie Quote wurde überschritten und Funktionen zurückgegeben cors Fehleraccess to external network resources not allowed if the billing account is not enabled
. Nach dem Aktivieren des Abrechnungskontos funktioniert es einwandfrei. Dies ist auch eines der nicht mit Cors zusammenhängenden Beispiele, es wird jedoch ein Cors-Fehler ausgegeben.Ich habe eine kleine Ergänzung zu @Andreys Antwort auf seine eigene Frage.
Es scheint, dass Sie den Rückruf in der
cors(req, res, cb)
Funktion nicht aufrufen müssen. Sie können also einfach das cors-Modul oben in Ihrer Funktion aufrufen, ohne den gesamten Code in den Rückruf einzubetten. Dies ist viel schneller, wenn Sie cors anschließend implementieren möchten.Vergessen Sie nicht, cors wie im Eröffnungsbeitrag erwähnt zu initiieren:
const cors = require('cors')({origin: true});
quelle
cors(request, response, () => { return response.send("Hello from Firebase!"); });
Dies könnte hilfreich sein. Ich habe eine Firebase-HTTP-Cloud-Funktion mit Express (benutzerdefinierte URL) erstellt.
Bitte stellen Sie sicher, dass Sie Abschnitte zum Umschreiben hinzugefügt haben
quelle
Ich habe gerade ein kleines Stück darüber veröffentlicht:
https://mhaligowski.github.io/blog/2017/03/10/cors-in-cloud-functions.html
Im Allgemeinen sollten Sie das Express CORS-Paket verwenden , das ein wenig herumhacken muss, um die Anforderungen in den GCF / Firebase-Funktionen zu erfüllen.
Hoffentlich hilft das!
quelle
Wenn es Leute wie mich gibt: Wenn Sie die Cloud-Funktion aus demselben Projekt wie die Cloud-Funktion selbst aufrufen möchten, können Sie die firebase sdk initiieren und die onCall-Methode verwenden. Es wird alles für Sie erledigen:
Rufen Sie diese Funktion folgendermaßen auf:
Firebase-Dokumente: https://firebase.google.com/docs/functions/callable
Wenn Sie das SDK nicht initiieren können, ist hier die Essenz der anderen Vorschläge:
quelle
Es wurde eine Möglichkeit gefunden, cors zu aktivieren, ohne eine 'cors'-Bibliothek zu importieren. Es funktioniert auch mit
Typescript
und testete es in Chrome Version 81.0.quelle
Für was es wert habe ich das gleiche Problem bei der Übergabe
app
inonRequest
. Ich erkannte, dass das Problem ein abschließender Schrägstrich in der Anforderungs-URL für die Firebase-Funktion war. Express suchte,'/'
aber ich hatte nicht den abschließenden Schrägstrich auf der Funktion[project-id].cloudfunctions.net/[function-name]
. Der CORS-Fehler war falsch negativ. Als ich den abschließenden Schrägstrich hinzufügte, erhielt ich die erwartete Antwort.quelle
[project-id]
da dies das Problem war, mit dem ich konfrontiert warNur so funktioniert es für mich, da ich eine Autorisierung in meiner Anfrage habe:
quelle
Wenn Sie das cors-Plugin nicht verwenden können / können,
setCorsHeaders()
funktioniert es auch , die Funktion als erstes in der Handler-Funktion aufzurufen .Verwenden Sie auch die AntwortenSuccess / Error-Funktionen, wenn Sie antworten.
quelle
Wenn Sie die Firebase-App lokal testen, müssen Sie Funktionen
localhost
anstelle der Cloud anzeigen. Standardmäßigfirebase serve
oderfirebase emulators:start
zeigt die Funktionen auf den Server anstatt auf localhost, wenn Sie sie in Ihrer Web-App verwenden.Fügen Sie das folgende Skript im HTML-Kopf nach dem Firebase-Init-Skript hinzu:
quelle
Das Ändern
true
von"*"
hat den Trick für mich getan, also sieht es so aus:Ich habe diesen Ansatz ausprobiert, weil im Allgemeinen so der Antwortheader festgelegt wird:
Beachten Sie, dass jede Domain Ihre Endpunkte aufrufen kann, daher ist sie NICHT sicher.
Weitere Informationen finden Sie in den Dokumenten: https://github.com/expressjs/cors
quelle
Wenn Sie Express nicht verwenden oder einfach nur CORS verwenden möchten. Der folgende Code hilft bei der Lösung
quelle
In meinem Fall wurde der Fehler durch den Zugriffsbeschränker der Cloud-Funktion verursacht. Bitte fügen Sie allUsers zum Cloud Function Invoker hinzu. Bitte fangen Sie den Link . Weitere Informationen finden Sie im Artikel
quelle
Wenn keine der anderen Lösungen funktioniert, können Sie versuchen, zu Beginn des Aufrufs die folgende Adresse hinzuzufügen, um die CORS-Umleitung zu aktivieren:
Beispielcode mit JQuery AJAX-Anforderung:
quelle
Ich füge meine Erfahrung hinzu. Ich habe stundenlang versucht herauszufinden, warum ich einen CORS-Fehler hatte.
Es kommt vor, dass ich meine Cloud-Funktion umbenannt habe (das allererste, was ich nach einem großen Upgrade versucht habe).
Wenn meine Firebase-App die Cloud-Funktion mit einem falschen Namen aufrief, sollte sie einen 404-Fehler und keinen CORS-Fehler auslösen.
Das Problem wurde behoben, indem der Name der Cloud-Funktion in meiner Firebase-App behoben wurde.
Ich habe hier einen Fehlerbericht unter https://firebase.google.com/support/troubleshooter/report/bugs ausgefüllt
quelle