Zweryfikuj tokeny identyfikacyjne

Jeśli Twoja aplikacja kliencka Firebase komunikuje się z niestandardowym serwerem zaplecza, może być konieczne zidentyfikowanie aktualnie zalogowanego użytkownika na tym serwerze. Aby zrobić to bezpiecznie, po udanym logowaniu wyślij token ID użytkownika na swój serwer za pomocą protokołu HTTPS. Następnie na serwerze zweryfikuj integralność i autentyczność tokena ID i pobierz z niego uid . Przesłany w ten sposób uid możesz wykorzystać do bezpiecznej identyfikacji aktualnie zalogowanego użytkownika na Twoim serwerze.

Zanim zaczniesz

Aby zweryfikować tokeny identyfikacyjne za pomocą pakietu Firebase Admin SDK, musisz mieć konto usługi. Postępuj zgodnie z instrukcjami konfiguracji pakietu Admin SDK, aby uzyskać więcej informacji na temat inicjowania pakietu Admin SDK przy użyciu konta usługi.

Pobierz tokeny identyfikacyjne na klientach

Gdy użytkownik lub urządzenie pomyślnie się zaloguje, Firebase tworzy odpowiedni token identyfikacyjny, który jednoznacznie go identyfikuje i zapewnia dostęp do kilku zasobów, takich jak baza danych Firebase Realtime i Cloud Storage. Możesz ponownie użyć tego tokena identyfikacyjnego do zidentyfikowania użytkownika lub urządzenia na niestandardowym serwerze zaplecza. Aby pobrać token ID od klienta, upewnij się, że użytkownik jest zalogowany, a następnie uzyskaj token ID od zalogowanego użytkownika:

iOS+

Cel 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
          // ...
}];
Szybki
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();
            }
        }
    });

Jedność

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 już zdobędziesz token identyfikacyjny, możesz wysłać ten JWT do swojego backendu i sprawdzić go za pomocą pakietu Firebase Admin SDK lub korzystając z biblioteki JWT innej firmy, jeśli Twój serwer jest napisany w języku, którego Firebase natywnie nie obsługuje.

Zweryfikuj tokeny identyfikacyjne za pomocą pakietu Firebase Admin SDK

Pakiet Firebase Admin SDK ma wbudowaną metodę weryfikowania i dekodowania tokenów identyfikacyjnych. Jeżeli podany token ID ma poprawny format, nie wygasł i jest prawidłowo podpisany, metoda zwraca zdekodowany token ID. Możesz pobrać uid użytkownika lub urządzenia z zdekodowanego tokena.

Postępuj zgodnie z instrukcjami konfiguracji pakietu Admin SDK , aby zainicjować pakiet Admin SDK przy użyciu konta usługi. Następnie użyj metody verifyIdToken() , aby zweryfikować token ID:

Node.js

// idToken comes from the client app
getAuth()
  .verifyIdToken(idToken)
  .then((decodedToken) => {
    const uid = decodedToken.uid;
    // ...
  })
  .catch((error) => {
    // Handle error
  });

Jawa

// idToken comes from the client app (shown above)
FirebaseToken decodedToken = FirebaseAuth.getInstance().verifyIdToken(idToken);
String uid = decodedToken.getUid();

Pyton

# id_token comes from the client app (shown above)

decoded_token = auth.verify_id_token(id_token)
uid = decoded_token['uid']

Iść

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 identyfikacyjnego wymaga identyfikatora projektu. Pakiet Firebase Admin SDK próbuje uzyskać identyfikator projektu za pomocą jednej z następujących metod:

  • Jeśli zestaw SDK został zainicjowany z jawną opcją aplikacji projectId , zestaw SDK używa wartości tej opcji.
  • Jeśli zestaw SDK został zainicjowany przy użyciu poświadczeń konta usługi, zestaw SDK używa pola project_id obiektu JSON konta usługi.
  • Jeśli ustawiona jest zmienna środowiskowa GOOGLE_CLOUD_PROJECT , SDK używa jej wartości jako identyfikatora projektu. Ta zmienna środowiskowa jest dostępna dla kodu działającego w infrastrukturze Google, takiej jak App Engine i Compute Engine.

Zweryfikuj tokeny identyfikacyjne przy użyciu biblioteki JWT innej firmy

Jeśli Twój backend jest w języku nieobsługiwanym przez pakiet Firebase Admin SDK, nadal możesz weryfikować tokeny identyfikacyjne. Najpierw znajdź bibliotekę JWT innej firmy dla swojego języka . Następnie sprawdź nagłówek, ładunek i podpis tokena identyfikacyjnego.

Sprawdź, czy nagłówek tokenu identyfikacyjnego jest zgodny z następującymi ograniczeniami:

Oświadczenia nagłówka tokenu identyfikacyjnego
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 tokenu identyfikacyjnego jest zgodny z następującymi ograniczeniami:

Roszczenia dotyczące ładunku tokenu identyfikacyjnego
exp Data ważności Musi być w przyszłości. Czas mierzony jest w sekundach od epoki UNIX.
iat Wydane w odpowiednim czasie Musi być w przeszłości. Czas mierzony jest w sekundach od epoki UNIX.
aud Publiczność Musi to być identyfikator projektu Firebase, unikalny identyfikator projektu Firebase, który można znaleźć w adresie URL konsoli tego projektu.
iss Emitent Musi mieć "https://securetoken.google.com/<projectId>" , gdzie <projectId> to ten sam identyfikator projektu, który został użyty w powyższym aud .
sub Temat Musi być niepustym ciągiem znaków i musi być uid użytkownika lub urządzenia.
auth_time Czas uwierzytelnienia Musi być w przeszłości. Czas uwierzytelnienia użytkownika.

Na koniec upewnij się, że token identyfikacyjny został podpisany kluczem prywatnym odpowiadającym żądaniu kid tokenu. 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ę pomyślnie, możesz użyć tematu ( sub ) tokena identyfikacyjnego jako uid odpowiedniego użytkownika lub urządzenia.