Mit der neuen Firebase-Cloud-Funktion habe ich beschlossen, einen Teil meines HTTP-Endpunkts auf Firebase zu verschieben. Alles funktioniert super ... Aber ich habe das folgende Problem. Ich habe zwei Endpunkte, die von HTTP-Triggern (Cloud-Funktionen) erstellt wurden.
- Ein API-Endpunkt zum Erstellen von Benutzern und zum Zurückgeben des vom Firebase Admin SDK generierten benutzerdefinierten Tokens.
- Ein API-Endpunkt zum Abrufen bestimmter Benutzerdetails.
Der erste Endpunkt ist zwar in Ordnung, aber für meinen zweiten Endpunkt möchte ich ihn nur für authentifizierte Benutzer schützen. Das heißt, jemand, der das Token hat, das ich zuvor generiert habe.
Wie löse ich das?
Ich weiß, dass wir die Header-Parameter in der Cloud-Funktion mit abrufen können
request.get('x-myheader')
Aber gibt es eine Möglichkeit, den Endpunkt genauso zu schützen wie die Echtzeitdatenbank?
firebase
firebase-realtime-database
firebase-authentication
firebase-security
google-cloud-functions
spaceMonkey
quelle
quelle
Antworten:
Es gibt ein offizielles Codebeispiel für das, was Sie tun möchten. Es wird veranschaulicht, wie Sie Ihre HTTPS-Funktion so einrichten, dass ein Autorisierungsheader mit dem Token erforderlich ist, das der Client während der Authentifizierung erhalten hat. Die Funktion verwendet die Firebase-Admin-Bibliothek, um das Token zu überprüfen.
Sie können auch " aufrufbare Funktionen " verwenden, um einen Großteil dieser Boilerplate zu vereinfachen, wenn Ihre App Firebase-Clientbibliotheken verwenden kann.
quelle
Wie von @Doug erwähnt, können Sie
firebase-admin
ein Token überprüfen. Ich habe ein kurzes Beispiel aufgestellt:Im obigen Beispiel habe ich auch CORS aktiviert, aber das ist optional. Zuerst erhalten Sie den
Authorization
Header und finden das heraustoken
.Anschließend können Sie
firebase-admin
dieses Token überprüfen. In der Antwort erhalten Sie die dekodierten Informationen für diesen Benutzer. Andernfalls wird ein Fehler ausgegeben, wenn das Token nicht gültig ist.quelle
getIdToken()
Methode auf clientseitigen (z. B.firebase.auth().currentUser.getIdToken().then(token => console.log(token))
) Firebase-Dokumenten verwendenWie auch von @Doug erwähnt, können Sie Callable Functions verwenden, um Boilerplate-Code von Ihrem Client und Ihrem Server auszuschließen .
Aufrufbare Exampale-Funktion:
Es kann wie folgt direkt von Ihrem Client aufgerufen werden:
quelle
Die oben genannten Methoden authentifizieren den Benutzer mithilfe der Logik innerhalb der Funktion. Daher muss die Funktion weiterhin aufgerufen werden, um die Überprüfung durchzuführen.
Das ist eine völlig gute Methode, aber der Vollständigkeit halber gibt es eine Alternative:
Sie können eine Funktion als „privat“ gesetzt , so dass es nicht kann , außer durch registrierte Benutzer aufgerufen werden (Sie entscheiden , auf Berechtigungen). In diesem Fall werden nicht authentifizierte Anforderungen außerhalb des Kontextes der Funktion abgelehnt, und die Funktion wird überhaupt nicht aufgerufen.
Hier finden Sie Verweise auf (a) Konfigurieren von Funktionen als öffentlich / privat und (b) Authentifizieren von Endbenutzern für Ihre Funktionen .
Beachten Sie, dass die oben genannten Dokumente für die Google Cloud Platform gelten. Dies funktioniert in der Tat, da jedes Firebase-Projekt auch ein GCP-Projekt ist. Eine verwandte Einschränkung bei dieser Methode ist, dass sie zum Zeitpunkt des Schreibens nur mit der auf einem Google-Konto basierenden Authentifizierung funktioniert.
quelle
Es gibt ein schönes offizielles Beispiel für die Verwendung von Express - möglicherweise in Zukunft nützlich: https://github.com/firebase/functions-samples/blob/master/authorized-https-endpoint/functions/index.js (unten eingefügt) sicher)
Denken Sie daran,
exports.app
dass Ihre Funktionen unter/app
slug verfügbar sind (in diesem Fall gibt es nur eine Funktion, die unter verfügbar ist<you-firebase-app>/app/hello
. Um sie zu entfernen, müssen Sie den Express-Teil tatsächlich ein wenig umschreiben (der Middleware-Teil für die Validierung bleibt gleich - er funktioniert sehr gut) gut und dank Kommentaren durchaus verständlich).Mein Umschreiben, um loszuwerden
/app
:quelle
Ich habe Probleme damit, eine ordnungsgemäße Firebase-Authentifizierung in der Golang GCP-Funktion zu erhalten. Da es dafür eigentlich kein Beispiel gibt, habe ich beschlossen, diese winzige Bibliothek zu erstellen: https://github.com/Jblew/go-firebase-auth-in-gcp-functions
Jetzt können Sie Benutzer einfach mit firebase-auth authentifizieren (was sich von gcp-authentifizierten Funktionen unterscheidet und vom identitätsbewussten Proxy nicht direkt unterstützt wird).
Hier ist ein Beispiel für die Verwendung des Dienstprogramms:
Denken Sie
--allow-unauthenticated
daran, Ihre Funktion mit Flag bereitzustellen (da die Firebase-Authentifizierung innerhalb der Funktionsausführung erfolgt).Hoffe das wird dir helfen, da es mir geholfen hat. Ich war aus Leistungsgründen entschlossen, Golang für Cloud-Funktionen zu verwenden - Jędrzej
quelle
In Firebase ist es nur eine Frage der architektonischen Gestaltung , um Ihren Code und Ihre Arbeit zu vereinfachen :
Express
. Verwenden Sie zur Steuerung dieses Sicherheitsaspekts nur die Einschränkung derselben Website oder einer bestimmten WebsiteCORS
. DiesExpress
ist sinnvoll , da es für SEO aufgrund seines serverseitigen Rendering-Inhalts nützlich ist.context
Parameter, um alle Probleme zu sparen. Dies ist auch sinnvoll, da beispielsweise eine mit AngularJS erstellte Single Page App für SEO schlecht ist. Da es sich jedoch um eine passwortgeschützte App handelt, benötigen Sie auch nicht viel SEO. In Bezug auf das Templating verfügt AngularJS über ein integriertes Templating, sodass keine serverseitige Vorlage mit erforderlich istExpress
. Dann sollten aufrufbare Firebase-Funktionen gut genug sein.In Anbetracht des oben Gesagten, keine Probleme mehr und das Leben leichter machen.
quelle