Jeśli aplikacja kliencka Firebase komunikuje się z niestandardowym serwerem backendu, może być konieczne zidentyfikowanie na tym serwerze aktualnie zalogowanego użytkownika. Aby to zrobić w bezpieczny sposób, po pomyślnym zalogowaniu się wyślij token identyfikatora użytkownika na serwer za pomocą protokołu HTTPS. Następnie na serwerze sprawdź integralność i autentyczność tokena identyfikatora oraz pobierz z niego adres uid
. Za pomocą uid
przesyłanego w ten sposób możesz bezpiecznie identyfikować aktualnie zalogowanego użytkownika na serwerze.
Zanim zaczniesz
Aby weryfikować tokeny identyfikatora za pomocą pakietu Firebase Admin SDK, musisz mieć konto usługi. Więcej informacji o inicjowaniu pakietu Admin SDK za pomocą konta usługi znajdziesz w instrukcjach konfiguracji pakietu Admin SDK.
Pobieranie tokenów identyfikatora na klientach
Gdy użytkownik lub urządzenie zaloguje się, Firebase tworzy odpowiedni token identyfikacyjny, który jednoznacznie identyfikuje użytkownika lub urządzenie i przyznaje mu dostęp do kilku zasobów, takich jak Firebase Realtime Database i Cloud Storage. Możesz ponownie użyć tego tokena identyfikatora, aby zidentyfikować użytkownika lub urządzenie na niestandardowym serwerze backendu. Aby pobrać token identyfikatora z klienta, upewnij się, że użytkownik jest zalogowany, a następnie pobierz token identyfikatora zalogowanego użytkownika:
iOS+
Objective-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
// ...
}];
Swift
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();
}
}
});
Unity
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
// ...
}
Sieć
firebase.auth().currentUser.getIdToken(/* forceRefresh */ true).then(function(idToken) {
// Send token to your backend via HTTPS
// ...
}).catch(function(error) {
// Handle error
});
Gdy uzyskasz token identyfikatora, możesz wysłać ten token JWT do backendu i zweryfikować go za pomocą pakietu Firebase Admin SDK lub biblioteki JWT innej firmy, jeśli serwer jest napisany w języku, którego Firebase nie obsługuje natywnie.
Weryfikowanie tokenów identyfikacyjnych za pomocą pakietu Firebase Admin SDK
Pakiet Firebase Admin SDK ma wbudowaną metodę weryfikacji i dekodowania tokenów identyfikacyjnych. Jeśli podany token identyfikacji ma prawidłowy format, nie wygasł i jest prawidłowo podpisany, metoda zwraca zdekodowany token identyfikacji. Z zdekodowanego tokena możesz pobrać uid
użytkownika lub urządzenia.
Aby zainicjować pakiet Admin SDK za pomocą konta usługi, postępuj zgodnie z instrukcjami konfiguracji pakietu Admin SDK. Następnie użyj metody verifyIdToken()
, aby zweryfikować token identyfikatora:
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']
Go
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;
Weryfikacja tokena tożsamości wymaga identyfikatora projektu. Pakiet Firebase Admin SDK próbuje uzyskać identyfikator projektu jedną z tych metod:
- Jeśli pakiet SDK został zainicjowany za pomocą jawnej opcji
projectId
app, używa on wartości tej opcji. - Jeśli pakiet SDK został zainicjowany za pomocą danych logowania do konta usługi, używa on pola
project_id
w obiekcie JSON konta usługi. - Jeśli zmienna środowiskowa
GOOGLE_CLOUD_PROJECT
jest ustawiona, pakiet SDK używa jej wartości jako identyfikatora projektu. Ta zmienna środowiskowa jest dostępna w przypadku kodu działającego w infrastrukturze Google, np. App Engine i Compute Engine.
Weryfikowanie tokenów tożsamości za pomocą biblioteki JWT innej firmy
Jeśli Twój backend jest napisany w języku nieobsługiwanym przez pakiet SDK Firebase Admin, nadal możesz weryfikować tokeny identyfikatora. Najpierw znajdź bibliotekę JWT innej firmy w swoim języku. Następnie sprawdź nagłówek, ładunek i sygnaturę tokena identyfikatora.
Sprawdź, czy nagłówek tokena identyfikatora spełnia te wymagania:
Deklaracje w nagłówku tokena tożsamości | ||
---|---|---|
alg |
Algorytm | "RS256" |
kid |
Identyfikator klucza |
Musi odpowiadać jednemu z kluczy publicznych wymienionych na stronie
https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com
|
Sprawdź, czy ładunek tokena identyfikatora spełnia te ograniczenia:
Deklaracje w ładunku tokena identyfikatora | ||
---|---|---|
exp |
Okres ważności | Musi przypadać w przyszłości. Czas jest mierzony w sekundach od początku epoki UNIX. |
iat |
Godzina wydania | Musi przypadać w przeszłości. Czas jest mierzony w sekundach od początku epoki UNIX. |
aud |
Odbiorcy | Musi to być identyfikator projektu Firebase, czyli unikalny identyfikator projektu Firebase, który można znaleźć w adresie URL konsoli tego projektu. |
iss |
Wystawca |
Musi mieć postać "https://securetoken.google.com/<projectId>" , gdzie <projectId> to ten sam identyfikator projektu, który został użyty w przypadku aud powyżej.
|
sub |
Temat |
Musi to być niepusty ciąg znaków, który musi być uid użytkownika lub urządzenia.
|
auth_time
|
Czas uwierzytelniania | Musi przypadać w przeszłości. Czas uwierzytelnienia użytkownika. |
Na koniec sprawdź, czy token identyfikatora został podpisany kluczem prywatnym odpowiadającym roszczeniu kid
tokena. Pobierz klucz publiczny z https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com
i użyj biblioteki JWT, aby zweryfikować podpis. Użyj wartości max-age
w nagłówku Cache-Control
odpowiedzi z tego punktu końcowego, aby wiedzieć, kiedy odświeżyć klucze publiczne.
Jeśli wszystkie powyższe weryfikacje zakończą się powodzeniem, możesz użyć pola „sub” (sub
) tokena tożsamości jako pola uid
odpowiedniego użytkownika lub urządzenia.