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. Mithilfe der so übermittelten uid
können Sie den aktuell angemeldeten Benutzer auf Ihrem Server sicher identifizieren.
Bevor Sie beginnen
Um ID-Tokens mit dem Firebase Admin SDK zu überprüfen, müssen Sie über ein Dienstkonto verfügen. Befolgen Sie die Anweisungen zum Einrichten des Admin SDK , um weitere Informationen zum Initialisieren des Admin SDK mit einem Dienstkonto zu erhalten.
Rufen Sie ID-Tokens auf Clients ab
Wenn sich ein Benutzer oder ein Gerät erfolgreich anmeldet, erstellt Firebase ein entsprechendes ID-Token, das ihn eindeutig identifiziert und ihm Zugriff auf mehrere Ressourcen gewährt, beispielsweise die Firebase-Echtzeitdatenbank und den Cloud-Speicher. Sie können dieses ID-Token wiederverwenden, um den Benutzer oder das Gerät auf Ihrem benutzerdefinierten Backend-Server zu identifizieren. Um das ID-Token vom Client abzurufen, stellen Sie sicher, dass der Benutzer angemeldet ist, und holen Sie sich dann das ID-Token vom angemeldeten Benutzer:
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 über ein ID-Token verfügen, können Sie dieses JWT an Ihr Backend senden und es mithilfe des Firebase Admin SDK oder mithilfe einer JWT-Bibliothek eines Drittanbieters validieren, wenn Ihr Server in einer Sprache geschrieben ist, die Firebase nicht nativ unterstützt.
Überprüfen Sie ID-Tokens mit dem Firebase Admin SDK
Das Firebase Admin SDK verfügt über eine integrierte Methode zum Überprüfen und Dekodieren von ID-Tokens. Wenn das bereitgestellte ID-Token das richtige Format hat, nicht abgelaufen ist und ordnungsgemäß signiert ist, gibt die Methode das dekodierte ID-Token zurück. Sie können die uid
des Benutzers oder Geräts aus dem entschlüsselten Token abrufen.
Befolgen Sie die Setup-Anweisungen für das Admin SDK , um das Admin SDK mit einem Dienstkonto zu initialisieren. Verwenden Sie dann die Methode verifyIdToken()
, um ein ID-Token zu überprüfen:
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 ID-Token-Verifizierung ist eine Projekt-ID erforderlich. Das Firebase Admin SDK versucht, über eine der folgenden Methoden eine Projekt-ID zu erhalten:
- Wenn das SDK mit einer expliziten
projectId
App-Option initialisiert wurde, verwendet das SDK den Wert dieser Option. - Wenn das SDK mit Dienstkonto-Anmeldeinformationen initialisiert wurde, verwendet das SDK das Feld
project_id
des Dienstkonto-JSON-Objekts. - 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 der Google-Infrastruktur wie App Engine und Compute Engine ausgeführt wird.
Überprüfen Sie ID-Token mithilfe einer JWT-Bibliothek eines Drittanbieters
Wenn Ihr Backend in einer Sprache ist, die nicht vom Firebase Admin SDK unterstützt wird, können Sie ID-Tokens trotzdem überprüfen. Suchen Sie zunächst nach einer 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-Nutzlastansprüche | ||
---|---|---|
exp | Ablaufzeit | Muss in der Zukunft liegen. Die Zeit wird in Sekunden seit der UNIX-Epoche gemessen. |
iat | Ausgestellt zum Zeitpunkt | Muss in der Vergangenheit liegen. Die Zeit wird in Sekunden seit der UNIX-Epoche gemessen. |
aud | Publikum | Dies 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 wurde. |
sub | Thema | Darf eine nicht leere Zeichenfolge sein und muss die uid des Benutzers oder Geräts sein. |
auth_time | Authentifizierungszeit | Muss in der Vergangenheit liegen. Der Zeitpunkt, zu dem sich der Benutzer authentifiziert hat. |
Stellen Sie abschließend sicher, dass das ID-Token mit dem privaten Schlüssel signiert wurde, der dem kid
des Tokens entspricht. Besorgen 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.