Wenn Ihre Firebase-Client-App mit einem benutzerdefinierten Back-End-Server kommuniziert, müssen Sie möglicherweise den aktuell angemeldeten Benutzer auf diesem Server identifizieren. Um dies sicher zu tun, senden Sie nach einer erfolgreichen Anmeldung das ID-Token des Benutzers über HTTPS an Ihren Server. Überprüfen Sie dann auf dem Server die Integrität und Authentizität des ID-Tokens und rufen Sie die uid
daraus ab. Mit der so übermittelten uid
können Sie den aktuell angemeldeten Benutzer auf Ihrem Server sicher identifizieren.
Bevor Sie beginnen
Um ID-Token mit dem Firebase Admin SDK zu überprüfen, müssen Sie über ein Dienstkonto verfügen. Befolgen Sie die Anweisungen zur Einrichtung des Admin SDK, um weitere Informationen zum Initialisieren des Admin SDK mit einem Dienstkonto zu erhalten.
ID-Token auf Clients abrufen
Wenn sich ein Benutzer oder Gerät erfolgreich anmeldet, erstellt Firebase ein entsprechendes ID-Token, das ihn eindeutig identifiziert und ihm Zugriff auf mehrere Ressourcen wie Firebase Realtime Database und Cloud Storage gewährt. Sie können dieses ID-Token wiederverwenden, um den Benutzer oder das Gerät auf Ihrem benutzerdefinierten Back-End-Server zu identifizieren. Um das ID-Token vom Client abzurufen, stellen Sie sicher, dass der Benutzer angemeldet ist, und rufen Sie dann das ID-Token vom angemeldeten Benutzer ab:
iOS+
Ziel c
FIRUser *currentUser = [FIRAuth auth].currentUser;
[currentUser getIDTokenForcingRefresh:YES
completion:^(NSString *_Nullable idToken,
NSError *_Nullable error) {
if (error) {
// Handle error
return;
}
// Send token to your backend via HTTPS
// ...
}];
Schnell
let currentUser = FIRAuth.auth()?.currentUser
currentUser?.getIDTokenForcingRefresh(true) { idToken, error in
if let error = error {
// Handle error
return;
}
// Send token to your backend via HTTPS
// ...
}
Android
FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
mUser.getIdToken(true)
.addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
public void onComplete(@NonNull Task<GetTokenResult> task) {
if (task.isSuccessful()) {
String idToken = task.getResult().getToken();
// Send token to your backend via HTTPS
// ...
} else {
// Handle error -> task.getException();
}
}
});
Einheit
Firebase.Auth.FirebaseUser user = auth.CurrentUser;
user.TokenAsync(true).ContinueWith(task => {
if (task.IsCanceled) {
Debug.LogError("TokenAsync was canceled.");
return;
}
if (task.IsFaulted) {
Debug.LogError("TokenAsync encountered an error: " + task.Exception);
return;
}
string idToken = task.Result;
// Send token to your backend via HTTPS
// ...
});
C++
firebase::auth::User user = auth->current_user();
if (user.is_valid()) {
firebase::Future<std::string> idToken = user.GetToken(true);
// Send token to your backend via HTTPS
// ...
}
Netz
firebase.auth().currentUser.getIdToken(/* forceRefresh */ true).then(function(idToken) {
// Send token to your backend via HTTPS
// ...
}).catch(function(error) {
// Handle error
});
Sobald Sie ein ID-Token haben, können Sie dieses JWT an Ihr Back-End senden und es mit dem Firebase Admin SDK oder mit einer JWT-Bibliothek eines Drittanbieters validieren, wenn Ihr Server in einer Sprache geschrieben ist, die Firebase nicht nativ unterstützt.
Überprüfen Sie ID-Token mit dem Firebase Admin SDK
Das Firebase Admin SDK verfügt über eine integrierte Methode zum Überprüfen und Entschlüsseln von ID-Token. Wenn das bereitgestellte ID-Token das richtige Format hat, nicht abgelaufen und ordnungsgemäß signiert ist, gibt die Methode das decodierte ID-Token zurück. Sie können die uid
des Benutzers oder Geräts aus dem decodierten Token abrufen.
Befolgen Sie die Anweisungen zur Einrichtung des Admin SDK , um das Admin SDK mit einem Dienstkonto zu initialisieren. Verwenden Sie dann die Methode verifyIdToken()
, um ein ID-Token zu verifizieren:
Node.js
// idToken comes from the client app
getAuth()
.verifyIdToken(idToken)
.then((decodedToken) => {
const uid = decodedToken.uid;
// ...
})
.catch((error) => {
// Handle error
});
Java
// idToken comes from the client app (shown above)
FirebaseToken decodedToken = FirebaseAuth.getInstance().verifyIdToken(idToken);
String uid = decodedToken.getUid();
Python
# id_token comes from the client app (shown above)
decoded_token = auth.verify_id_token(id_token)
uid = decoded_token['uid']
gehen
client, err := app.Auth(ctx)
if err != nil {
log.Fatalf("error getting Auth client: %v\n", err)
}
token, err := client.VerifyIDToken(ctx, idToken)
if err != nil {
log.Fatalf("error verifying ID token: %v\n", err)
}
log.Printf("Verified ID token: %v\n", token)
C#
FirebaseToken decodedToken = await FirebaseAuth.DefaultInstance
.VerifyIdTokenAsync(idToken);
string uid = decodedToken.Uid;
Für die Überprüfung des ID-Tokens ist eine Projekt-ID erforderlich. Das Firebase Admin SDK versucht, eine Projekt-ID über eine der folgenden Methoden abzurufen:
- Wenn das SDK mit einer expliziten
projectId
-App-Option initialisiert wurde, verwendet das SDK den Wert dieser Option. - Wenn das SDK mit Anmeldeinformationen für das Dienstkonto initialisiert wurde, verwendet das SDK das Feld
project_id
des JSON-Objekts des Dienstkontos. - Wenn die Umgebungsvariable
GOOGLE_CLOUD_PROJECT
festgelegt ist, verwendet das SDK ihren Wert als Projekt-ID. Diese Umgebungsvariable ist für Code verfügbar, der auf einer Google-Infrastruktur wie App Engine und Compute Engine ausgeführt wird.
Verifizieren Sie ID-Token mit einer JWT-Bibliothek eines Drittanbieters
Wenn Ihr Back-End in einer Sprache ist, die nicht vom Firebase Admin SDK unterstützt wird, können Sie ID-Token trotzdem verifizieren. Suchen Sie zunächst eine JWT-Bibliothek eines Drittanbieters für Ihre Sprache . Überprüfen Sie dann den Header, die Nutzlast und die Signatur des ID-Tokens.
Stellen Sie sicher, dass der Header des ID-Tokens den folgenden Einschränkungen entspricht:
ID-Token-Header-Ansprüche | ||
---|---|---|
alg | Algorithmus | "RS256" |
kid | Schlüssel-ID | Muss einem der unter https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com aufgeführten öffentlichen Schlüssel entsprechen |
Stellen Sie sicher, dass die Nutzlast des ID-Tokens den folgenden Einschränkungen entspricht:
ID-Token-Nutzdatenansprüche | ||
---|---|---|
exp | Ablaufzeit | Muss in der Zukunft liegen. Die Zeit wird in Sekunden seit der UNIX-Epoche gemessen. |
iat | Ausgestellt zur Zeit | Muss in der Vergangenheit liegen. Die Zeit wird in Sekunden seit der UNIX-Epoche gemessen. |
aud | Publikum | Muss Ihre Firebase-Projekt-ID sein, die eindeutige Kennung für Ihr Firebase-Projekt, die in der URL der Konsole dieses Projekts zu finden ist. |
iss | Aussteller | Muss "https://securetoken.google.com/<projectId>" sein, wobei <projectId> dieselbe Projekt-ID ist, die oben für aud verwendet wird. |
sub | Gegenstand | Muss eine nicht leere Zeichenfolge und die uid des Benutzers oder Geräts sein. |
auth_time | Authentifizierungszeit | Muss in der Vergangenheit liegen. Die Zeit, zu der sich der Benutzer authentifiziert hat. |
Stellen Sie schließlich sicher, dass das ID-Token mit dem privaten Schlüssel signiert wurde, der dem kid
des Tokens entspricht. Holen Sie sich den öffentlichen Schlüssel von https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com
und verwenden Sie eine JWT-Bibliothek, um die Signatur zu überprüfen. Verwenden Sie den Wert von max-age
im Cache-Control
Header der Antwort von diesem Endpunkt, um zu wissen, wann die öffentlichen Schlüssel aktualisiert werden müssen.
Wenn alle oben genannten Überprüfungen erfolgreich sind, können Sie den Betreff ( sub
) des ID-Tokens als uid
des entsprechenden Benutzers oder Geräts verwenden.