Jeśli aplikacja kliencka Firebase komunikuje się z niestandardowym serwerem backendu,
może być konieczne zidentyfikowanie
aktualnie zalogowanego użytkownika na tym serwerze. Aby to zrobić:
po zalogowaniu się bezpiecznie wyślij token identyfikatora użytkownika na swój serwer
za pomocą protokołu HTTPS. Następnie na serwerze zweryfikuj integralność i autentyczność
Identyfikator i pobierz z niego identyfikator uid
. uid
przesyłanych w
w ten sposób można bezpiecznie zidentyfikować obecnie zalogowanego użytkownika na serwerze.
Zanim zaczniesz
Aby weryfikować tokeny tożsamości za pomocą pakietu Firebase Admin SDK, musisz mieć usługę koncie. Postępuj zgodnie z instrukcjami konfiguracji pakietu Admin SDK, aby uzyskać dostęp do Dowiedz się więcej o tym, jak zainicjować pakiet Admin SDK za pomocą konta usługi.
Pobieranie tokenów tożsamości z klientów
Gdy użytkownik lub urządzenie zaloguje się prawidłowo, Firebase tworzy Token tożsamości, który jednoznacznie je identyfikuje i przyznaje dostęp do takie jak Firebase Realtime Database i Cloud Storage. Dostępne opcje ponowne użycie tego tokena identyfikatora do identyfikacji użytkownika lub urządzenia w niestandardowym backendzie serwera. Aby pobrać token identyfikatora od klienta, użytkownik musi być podpisany i pobierz token identyfikatora od 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
});
Po uzyskaniu tokena identyfikatora możesz wysłać go do backendu i zweryfikować za pomocą pakietu SDK Firebase Admin lub zewnętrznego tokena JWT jeśli serwer jest napisany w języku, którego Firebase nie używa natywną obsługę.
Weryfikowanie tokenów tożsamości za pomocą pakietu Firebase Admin SDK
Pakiet SDK Firebase Admin ma wbudowaną metodę weryfikacji i dekodowania identyfikatora
tokeny. Jeśli podany token identyfikatora ma prawidłowy format, nie stracił ważności i jest
prawidłowo podpisane, metoda zwraca zdekodowany token identyfikatora. Możesz pobrać
uid
użytkownika lub urządzenia ze zdekodowanego tokena.
Aby zainicjować pakiet Admin SDK, postępuj zgodnie z instrukcjami konfiguracji pakietu Admin SDK.
pakietu Admin SDK z kontem usługi. 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. Próby użycia pakietu Firebase Admin SDK by uzyskać identyfikator projektu, korzystając z jednej z tych metod:
- Jeśli pakiet SDK został zainicjowany za pomocą jawnej opcji aplikacji
projectId
, komponent Pakiet SDK używa wartości tej opcji. - Jeśli pakiet SDK został zainicjowany przy użyciu danych logowania konta usługi, pakiet używa
w polu
project_id
obiektu JSON konta usługi. - Jeśli ustawiona jest zmienna środowiskowa
GOOGLE_CLOUD_PROJECT
, pakiet SDK używa jego wartość jako identyfikator projektu. Ta zmienna środowiskowa jest dostępna dla kodu działającego w infrastrukturze Google, takiej jak App Engine czy Compute Engine
Weryfikowanie tokenów tożsamości za pomocą biblioteki JWT innej firmy
Jeśli backend jest w języku, który nie jest obsługiwany przez administratora Firebase SDK, nadal możesz weryfikować tokeny tożsamości. Po pierwsze, znaleźć bibliotekę JWT innej firmy dla swojego języka. Następnie: zweryfikować nagłówek, ładunek i podpis tokena tożsamości.
Sprawdź, czy nagłówek tokena identyfikatora jest zgodny z tymi ograniczeniami:
Żądania nagłówka tokena identyfikatora | ||
---|---|---|
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 jest zgodny z tymi ograniczeniami:
Żądania ładunku tokena identyfikatora | ||
---|---|---|
exp |
Okres ważności | Musi być w przyszłości. Czas jest mierzony w sekundach od momentu uruchomienia systemu UNIX epoki. |
iat |
Wystawiony w momencie | Musi przypadać w przeszłości. Czas jest mierzony w sekundach od momentu uruchomienia systemu UNIX epoki. |
aud |
Odbiorcy | Musi to być identyfikator Twojego projektu Firebase, unikalny identyfikator Firebase projekt, który można znaleźć w adresie URL jego konsoli. |
iss |
Wystawca |
Musi to być "https://securetoken.google.com/<projectId>" ,
gdzie <projectId> to ten sam identyfikator projektu, który został użyty do
aud powyżej.
|
sub |
Temat |
Pole nie może być puste i musi zawierać wartość uid użytkownika lub
urządzenia.
|
auth_time
|
Czas uwierzytelniania | Musi przypadać w przeszłości. Czas uwierzytelnienia użytkownika. |
Sprawdź też, czy token identyfikatora został podpisany przez klucz prywatny odpowiadający
do żądania kid
tokena. Pobierz klucz publiczny z
https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com
i użyj biblioteki JWT do weryfikacji podpisu. Użyj wartości max-age
w
nagłówek Cache-Control
odpowiedzi z tego punktu końcowego, aby wiedzieć, kiedy należy
odśwież klucze publiczne.
Jeśli wszystkie powyższe weryfikacje się zakończą, możesz użyć tematu (sub
)
tokena identyfikatora jako uid
odpowiedniego użytkownika lub urządzenia.