webentwicklung-frage-antwort-db.com.de

Kann ich in Firebase 3 noch eine serverseitige Überprüfung von Tokens durchführen?

Kann ich in Firebase 3 noch eine serverseitige Überprüfung von Tokens durchführen?

Wir generieren benutzerdefinierte Token (JWT) auf einem Server, auf dem Golang ausgeführt wird, unter Verwendung unseres vorhandenen Authentifizierungssystems (unter Verwendung eines Dienstkontos). Das Token wird auf einem iOS-Client mit verwendet

FIRAuth.auth()?.signInWithCustomToken(customToken)

Bis dahin funktioniert alles gut. Aber wenn wir das Client-Token an den Server übergeben, der abgerufen wurde von:

FIRUser.getTokenWithCompletion({ token, error in ..})

wir können es nicht verifizieren. Das JWT-Token ist mit RS256 signiert und hat eine header.kid, die wir nicht erkennen können. Der öffentliche Schlüssel des Dienstkontos (mit dem das benutzerdefinierte Token signiert wurde) überprüft das Client-Token nicht. Wird der öffentliche Schlüssel benötigt, um das verfügbare Client-Token zu validieren?

Ich weiß, dass es möglich ist, Client-Token mithilfe des Aufrufs "verifyIdToken" in Java oder Javascript) zu validieren, aber wir hoffen, dies in Golang mithilfe einer Standard-JWT-Bibliothek weiterhin tun zu können.

Dies alles funktionierte in Firebase 2 (mit HS256 und dem Firebase-Geheimnis) einwandfrei.

42
Tim Rob

Die kurze Antwort lautet ja. Die vollständige Antwort lautet, dass wir in den meisten Fällen jetzt ein geeigneteres Werkzeug haben. Viel hängt also von dem Anwendungsfall ab, den Sie lösen möchten.

Die neue SDK-Version ist um einiges leistungsfähiger, und wir haben die Funktionen nicht so gut zusammengefasst. Dies scheint ein guter Ort zu sein, um die verfügbaren Tools und ihre Verwendung gegenüberzustellen, und dann gehe ich am Ende auf einige spezifische Notizen von Drittanbietern (d. H. Go) ein.

Verwenden eines externen Authentifizierungstools für die Clientauthentifizierung

Die hauptsächliche Verwendung von benutzerdefinierten Münztoken besteht darin, Benutzern die Authentifizierung anhand eines von Ihnen gesteuerten externen/Legacy-Authentifizierungsmechanismus zu ermöglichen, z. B. Ihres LDAP-Servers. Der grundlegende Prozess hierfür wird hier behandelt: iOS , Android , Web .

Im Wesentlichen wird das JWT-Token von Ihrem Dienst nur überprüft und an den Client weitergeleitet. Der Client führt die Überprüfung/Authentifizierung mithilfe des von Ihnen bereitgestellten benutzerdefinierten Tokens durch.

Authentifizierung Ihrer privilegierten Mitarbeiter

Es ist nicht mehr erforderlich, benutzerdefinierte Token zur Authentifizierung Ihres Serverprozesses zu verwenden. Dies geschieht durch Erstellen eines Dienstkontos, das Schritt für Schritt unter Hinzufügen von Firebase zu Ihrem Server behandelt wird. Wenn Sie fertig sind, erhalten Sie eine JSON-Datei, die einen privaten Schlüssel enthält.

Anschließend fügen Sie Ihre Anmeldeinformationen für das Dienstkonto hinzu, indem Sie mit dem serviceAccount -Attribut in firebase.initializeApp() auf diese JSON verweisen. Das ist dokumentiert hier und sieht so aus (siehe Link für Java Version):

var firebase = require("firebase");

// Initialize the app with a service account, granting admin privileges
firebase.initializeApp({
  databaseURL: "https://databaseName.firebaseio.com",
  serviceAccount: "./serviceAccountCredentials.json"
});

Benutzer emulieren oder den Zugriff von einem Serverprozess einschränken

Es ist ziemlich einfach, einen Benutzer zu emulieren oder den Zugriff (dringend empfohlen) von einem Serverprozess aus zu beschränken. Sie müssen dafür nicht mehr wirklich ein benutzerdefiniertes Token prägen.

Dies erfordert nur das Hinzufügen von databaseAuthVariableOverride zu Ihrem Aufruf von database.initializeApp():

firebase.initializeApp({
  databaseURL: "https://databaseName.firebaseio.com",
  serviceAccount: "./serviceAccountCredentials.json",
  databaseAuthVariableOverride: {
    uid: "my-service-worker-or-user-uid"
  }
});

Überprüfung der Client-Identität mittels Sicherheit

Erstens können Sie normalerweise die serverseitige Überprüfung vermeiden, wenn Sie eine Firebase-Datenbank verwenden, indem Sie Ihren Client in die Datenbank schreiben lassen und Sicherheitsregeln verwenden, um deren Identität zu überprüfen. Wenn Ihr Server auf einem Pfad lauscht, in den eine Authentifizierung geschrieben werden muss, ist dies bereits ohne besondere Sicherheit auf dem Server gelöst.

Durch die Modellierung als Ereigniswarteschlange wird eine einfache, modulare und skalierbare Server-Worker-Strategie erstellt. Siehe firebase-queue für einige großartige Node.js-Tools. Es nterstützt 3.x .

Überprüfen der Client-ID-Token auf dem Server

Wenn Sie die Echtzeitdatenbank nicht verwenden und Client-Token empfangen müssen (z. B. über REST Aufrufe)) und deren Gültigkeit überprüfen möchten, können Sie dies mit verifyIdToken() tun. wie beschrieben hier . Dies würde wie folgt aussehen:

auth.verifyIdToken(idToken).then(function(decodedToken) {
  var uid = decodedToken.sub;
});

Wenn Sie sich dann als dieser Benutzer authentifizieren möchten, um in die Datenbank zu schreiben und die Sicherheit zu erzwingen, verwenden Sie den obigen Abschnitt Benutzer emulieren. Mit anderen Worten, rufen Sie initializeApp() mit einer databaseAuthVariableOverride auf, die auf die entsprechende UID festgelegt ist.

Beachten Sie, dass Sie, wenn Sie mehrmals versuchen, initializeApp() aufzurufen und eine Fehlermeldung ähnlich der folgenden erhalten: Error: Firebase App named '[DEFAULT]' already exists. Sie können mehrere Anwendungskontexte initialisieren, indem Sie dem Aufruf von initializeApp () ein zweites Argument hinzufügen (z. B. database.initializeApp({...}, 'asUser'+uid)) und verweisen Sie dann mit firebase.database('asUser'+uid) auf diese App-Instanz. ref (...). Um mehr über die Verwendung mehrerer App-Instanzen zu erfahren, siehe hier .

Java-Code finden Sie unter den obigen Links. Go und andere Lösungen von Drittanbietern, die im Folgenden behandelt werden.

Erstellen eines Tokens zur Verwendung in der REST API

Michael Bleigh hat dieses Szenario behandelt hier und verdient einen gewissen Repräsentanten dafür, dass er es ausgearbeitet hat.

Token erstellen oder über REST verifizieren

Dies wird nicht unterstützt. Es tut uns leid.

Golang und andere: Weitere werden folgen

Wir arbeiten an einer Bibliothek zum Prägen und Überprüfen von Go-Token. Wir werden in Kürze auch Python Tools für diesen Zweck hinzufügen. Kein Veröffentlichungsdatum oder Standardeinstellungen dafür. In der Zwischenzeit möchten Sie Client-ID-Token überprüfen, ohne den offiziellen zu verwenden Für Firebase Node.js oder Java Libraries (die über integrierte Überprüfungsmethoden verfügen) müssen Sie sicherstellen, dass das ID-Token (bei dem es sich um ein JWT handelt) den folgenden Anforderungen entspricht:

  • Sein dekodierter Header hat einen alg (Algorithmus) -Anspruch gleich "RS256".
  • Die dekodierte Nutzlast hat einen aud (Zielgruppen-) Claim, der Ihrer Firebase-Projekt-ID entspricht.
  • Die dekodierte Nutzlast hat einen Anspruch von iss (Emittent) gleich "https://securetoken.google.com/<projectId>".
  • Die dekodierte Nutzlast enthält eine nicht leere Zeichenfolge sub (subject) claim. Beachten Sie, dass dies das uid für diesen Firebase-Benutzer ist.
  • Der dekodierte Header hat den Anspruch kid (Schlüssel-ID), der einem der öffentlichen Schlüssel unter https://www.googleapis.com/robot/v1/metadata/x509/[email protected] Entspricht.
  • Sie müssen auch eine JWT-Bibliothek verwenden, um das Token mit dem öffentlichen Schlüssel zu verifizieren und nachzuweisen, dass das Token mit dem entsprechenden privaten Schlüssel des öffentlichen Schlüssels signiert wurde.

Für Go können Sie anscheinend jwt-go verwenden, um das Client-ID-Token zu dekodieren und zu validieren.

51
Kato

Nun, Firebase erlaubt keine Überprüfung von custom tokens, Was sie tun, um die Überprüfung von id tokens Zu ermöglichen, die sie generiert werden, sobald sich der Benutzer mit benutzerdefinierten Token anmeldet. So wie es bei mir der Fall war, liegt es an Ihnen, wenn Sie Firebase-Token an andere Dienste weitergeben, um sich bei Ihrem Backend zu authentifizieren. Auch das Google-Dienstkonto X509 cert Hat nicht das richtige Format. Es hat diese \n (new line) Begrenzer, die in Texteditoren nicht durch neue Zeilen ersetzt werden (ich benutze vim). Daher habe ich folgendes getan:

  val factory = CertificateFactory.getInstance("X.509")
  val certificateFile = this.getClass.getResourceAsStream(Play.current.configuration.getString("firebase.certificate").get)
  val publicKey = factory.generateCertificate(certificateFile).asInstanceOf[X509Certificate].getPublicKey
  val claimBody = Jwts.parser().setSigningKey(publicKey).parseClaimsJws(compactJws).getBody
  1. Rufen Sie das Zertifikat über den Link zum Google-Dienstkonto ab, der beim Einrichten von firebase im heruntergeladenen JSON angegeben wurde
  2. Ersetzen Sie \n Manuell durch eine neue Zeile
  3. Holen Sie sich die JWT-Bibliothek. Ich habe diese großartige Bibliothek benutzt, um Verifikation zu machen Java JWT
  4. Lesen Sie das Zertifikat und extrahieren Sie den öffentlichen Schlüssel.
  5. Verwenden Sie den öffentlichen Schlüssel, um das Token zu überprüfen
  6. Stellen Sie sicher, dass Sie eine andere API haben, um Token zu aktualisieren, da diese nur für eine Stunde gültig sind

Hoffentlich hilft das!

0
Richeek