Vérifier les jetons d'identification

Si votre application client Firebase communique avec un serveur backend personnalisé, vous devrez peut-être identifier l'utilisateur actuellement connecté sur ce serveur. Pour le faire en toute sécurité, après une connexion réussie, envoyez le jeton d'identification de l'utilisateur à votre serveur via HTTPS. Ensuite, sur le serveur, vérifiez l'intégrité et l'authenticité du jeton d'identification et récupérez-en l' uid . Vous pouvez utiliser l' uid transmis de cette manière pour identifier en toute sécurité l'utilisateur actuellement connecté sur votre serveur.

Avant que tu commences

Pour vérifier les jetons d'identification avec le SDK Firebase Admin, vous devez disposer d'un compte de service. Suivez les instructions de configuration du SDK Admin pour plus d'informations sur la façon d'initialiser le SDK Admin avec un compte de service.

Récupérer les jetons d'identification sur les clients

Lorsqu'un utilisateur ou un appareil se connecte avec succès, Firebase crée un jeton d'identification correspondant qui l'identifie de manière unique et lui accorde l'accès à plusieurs ressources, telles que la base de données en temps réel Firebase et le stockage cloud. Vous pouvez réutiliser ce jeton d'identification pour identifier l'utilisateur ou l'appareil sur votre serveur backend personnalisé. Pour récupérer le jeton d'ID du client, assurez-vous que l'utilisateur est connecté, puis récupérez le jeton d'ID de l'utilisateur connecté :

iOS+

Objectif 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
          // ...
}];
Rapide
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();
            }
        }
    });

Unité

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
  // ...
}

la toile

firebase.auth().currentUser.getIdToken(/* forceRefresh */ true).then(function(idToken) {
  // Send token to your backend via HTTPS
  // ...
}).catch(function(error) {
  // Handle error
});

Une fois que vous disposez d'un jeton d'identification, vous pouvez envoyer ce JWT à votre backend et le valider à l'aide du SDK d'administration Firebase ou à l'aide d'une bibliothèque JWT tierce si votre serveur est écrit dans un langage que Firebase ne prend pas en charge nativement.

Vérifier les jetons d'identification à l'aide du SDK d'administration Firebase

Le SDK Firebase Admin dispose d'une méthode intégrée pour vérifier et décoder les jetons d'identification. Si le jeton d'identification fourni a le format correct, n'a pas expiré et est correctement signé, la méthode renvoie le jeton d'identification décodé. Vous pouvez récupérer l' uid de l'utilisateur ou de l'appareil à partir du jeton décodé.

Suivez les instructions de configuration du SDK Admin pour initialiser le SDK Admin avec un compte de service. Ensuite, utilisez la méthode verifyIdToken() pour vérifier un jeton d'identification :

Noeud.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']

Aller

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;

La vérification du jeton d'identification nécessite un ID de projet. Le SDK d'administration Firebase tente d'obtenir un ID de projet via l'une des méthodes suivantes :

  • Si le SDK a été initialisé avec une option d’application projectId explicite, le SDK utilise la valeur de cette option.
  • Si le SDK a été initialisé avec les informations d'identification du compte de service, le SDK utilise le champ project_id de l'objet JSON du compte de service.
  • Si la variable d'environnement GOOGLE_CLOUD_PROJECT est définie, le SDK utilise sa valeur comme ID de projet. Cette variable d'environnement est disponible pour le code exécuté sur l'infrastructure Google telle que App Engine et Compute Engine.

Vérifier les jetons d'identification à l'aide d'une bibliothèque JWT tierce

Si votre backend est dans une langue non prise en charge par le SDK d'administration Firebase, vous pouvez toujours vérifier les jetons d'identification. Tout d'abord, recherchez une bibliothèque JWT tierce pour votre langue . Vérifiez ensuite l'en-tête, la charge utile et la signature du jeton d'identification.

Vérifiez que l'en-tête du jeton d'ID est conforme aux contraintes suivantes :

Revendications d'en-tête de jeton d'identification
alg Algorithme "RS256"
kid ID de clé Doit correspondre à l'une des clés publiques répertoriées sur https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com

Vérifiez que la charge utile du jeton d'ID est conforme aux contraintes suivantes :

Réclamations de charge utile de jeton d'identification
exp Date d'expiration Ça doit être dans le futur. Le temps est mesuré en secondes depuis l'époque UNIX.
iat Publié à l'époque Ça doit être du passé. Le temps est mesuré en secondes depuis l'époque UNIX.
aud Public Il doit s'agir de l'ID de votre projet Firebase, l'identifiant unique de votre projet Firebase, qui se trouve dans l'URL de la console de ce projet.
iss Émetteur Doit être "https://securetoken.google.com/<projectId>" , où <projectId> est le même ID de projet que celui utilisé pour aud ci-dessus.
sub Sujet Doit être une chaîne non vide et doit être l’ uid de l’utilisateur ou de l’appareil.
auth_time Temps d'authentification Ça doit être du passé. L’heure à laquelle l’utilisateur s’est authentifié.

Enfin, assurez-vous que le jeton d'identification a été signé par la clé privée correspondant à la revendication kid du jeton. Récupérez la clé publique sur https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com et utilisez une bibliothèque JWT pour vérifier la signature. Utilisez la valeur de max-age dans l'en-tête Cache-Control de la réponse de ce point de terminaison pour savoir quand actualiser les clés publiques.

Si toutes les vérifications ci-dessus réussissent, vous pouvez utiliser le sujet ( sub ) du jeton d'identification comme uid de l'utilisateur ou de l'appareil correspondant.