Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

Zweryfikuj tokeny identyfikacyjne

Jeśli aplikacja kliencka Firebase komunikuje się z niestandardowym serwerem zaplecza, może być konieczne zidentyfikowanie aktualnie zalogowanego użytkownika na tym serwerze. Aby to zrobić bezpiecznie, po pomyślnym zalogowaniu się wyślij token identyfikatora użytkownika na swój serwer przy użyciu protokołu HTTPS. Następnie na serwerze zweryfikuj integralność i autentyczność tokenu ID i pobierz z niego uid . Możesz użyć przesłanego w ten sposób identyfikatora uid aby bezpiecznie zidentyfikować aktualnie zalogowanego użytkownika na swoim serwerze.

Zanim zaczniesz

Aby zweryfikować tokeny identyfikatora 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 ID na klientach

Gdy użytkownik lub urządzenie pomyślnie się zaloguje, Firebase tworzy odpowiedni token identyfikacyjny, który jednoznacznie identyfikuje go i zapewnia dostęp do kilku zasobów, takich jak Baza danych czasu rzeczywistego Firebase i Cloud Storage. Możesz ponownie użyć tego tokena identyfikatora do identyfikacji użytkownika lub urządzenia na niestandardowym serwerze zaplecza. Aby pobrać token ID z klienta, upewnij się, że użytkownik jest zalogowany, a następnie pobierz 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 != nullptr) {
  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 swojego backendu i zweryfikować go za pomocą pakietu Firebase Admin SDK lub biblioteki JWT innej firmy, jeśli Twój serwer jest napisany w języku, którego Firebase nie obsługuje natywnie.

Zweryfikuj tokeny identyfikatora za pomocą pakietu Firebase Admin SDK

Pakiet Firebase Admin SDK ma wbudowaną metodę weryfikowania i dekodowania tokenów identyfikacyjnych. Jeśli dostarczony token ID ma poprawny format, nie wygasł i jest poprawnie podpisany, metoda zwraca zdekodowany token ID. Możesz pobrać uid użytkownika lub urządzenia z odkodowanego 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
admin
  .auth()
  .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']

Udać się

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)

DO#

FirebaseToken decodedToken = await FirebaseAuth.DefaultInstance
    .VerifyIdTokenAsync(idToken);
string uid = decodedToken.Uid;

Weryfikacja tokena identyfikatora wymaga identyfikatora projektu. Pakiet Firebase Admin SDK próbuje uzyskać identyfikator projektu za pomocą jednej z tych metod:

  • Jeśli projectId SDK został zainicjowany z jawną projectId aplikacji projectId SDK używa wartości tej opcji.
  • Jeśli zestaw SDK został zainicjowany przy użyciu poświadczeń konta usługi, project_id SDK używa pola project_id obiektu JSON konta usługi.
  • Jeśli ustawiona jest zmienna środowiskowa GOOGLE_CLOUD_PROJECT zestaw 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 ID przy użyciu zewnętrznej biblioteki JWT

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

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

Roszczenia dotyczące nagłówka tokena ID
alg Algorytm "RS256"
kid Identyfikator klucza Musi odpowiadać jednemu z kluczy publicznych wymienionych pod https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com

Sprawdź, czy ładunek tokena identyfikatora jest zgodny z następującymi ograniczeniami:

Roszczenia dotyczące ładunku tokena ID
exp Data ważności Musi być w przyszłości. Czas jest mierzony w sekundach od epoki UNIX.
iat Wydane w czasie Musi być w przeszłości. Czas jest mierzony 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 to być "https://securetoken.google.com/<projectId>" , gdzie <projectId> to ten sam identyfikator projektu, który został użyty w powyższym aud .
sub Przedmiot Musi być niepustym ciągiem i musi być uid użytkownika lub urządzenia.
auth_time Czas uwierzytelniania Musi być w przeszłości. Czas uwierzytelnienia użytkownika.

Na koniec upewnij się, że token identyfikatora został podpisany kluczem prywatnym odpowiadającym żądaniu 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łó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 ID jako uid użytkownika lub urządzenia.