Zweryfikuj tokeny tożsamości

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 takich jak Baza danych czasu rzeczywistego Firebase czy 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 SDK Firebase Admin

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 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 Nie może być pusty i musi być identyfikatorem 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 tożsamości jako uid odpowiedniego użytkownika lub urządzenia.