Zweryfikuj tokeny tożsamości

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 DatabaseCloud 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 EngineCompute 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.