Vérifier les jetons d'ID

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

Avant de commencer

Pour valider les jetons d'identité avec le SDK Admin Firebase, vous devez disposer d'un compte de service. Suivez les instructions de configuration du SDK Admin pour savoir comment initialiser le SDK Admin avec un compte de service.

Récupérer des jetons d'identité sur les clients

Lorsqu'un utilisateur ou un appareil se connecte avec succès, Firebase crée un jeton d'ID correspondant qui l'identifie de manière unique et lui donne accès à plusieurs ressources, telles que Firebase Realtime Database et Cloud Storage. Vous pouvez réutiliser ce jeton d'identité pour identifier l'utilisateur ou l'appareil sur votre serveur backend personnalisé. Pour récupérer le jeton d'identité du client, assurez-vous que l'utilisateur est connecté, puis obtenez le jeton d'identité de l'utilisateur connecté :

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

Web

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 avez un jeton d'identification, vous pouvez envoyer ce JWT à votre backend et le valider à l'aide du SDK Admin Firebase ou d'une bibliothèque JWT tierce si votre serveur est écrit dans un langage que Firebase ne prend pas en charge de manière native.

Valider les jetons d'identité à l'aide du SDK Admin Firebase

Le SDK Admin Firebase intègre une méthode permettant de vérifier et de décoder les jetons d'ID. Si le jeton d'ID fourni présente le bon format, qu'il n'a pas expiré et qu'il est correctement signé, la méthode renvoie le jeton d'ID décodé. Vous pouvez récupérer le 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 valider un jeton d'ID :

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;

La validation du jeton d'identité nécessite un ID de projet. Le SDK Admin Firebase tente d'obtenir un ID de projet à l'aide de 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 des identifiants de compte de service, il 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, comme App Engine et Compute Engine.

Valider les jetons d'identité à l'aide d'une bibliothèque JWT tierce

Si votre backend est écrit dans un langage non compatible avec le SDK Admin Firebase, vous pouvez toujours valider les jetons d'identification. Commencez par trouver une bibliothèque JWT tierce pour votre langage. Ensuite, validez l'en-tête, la charge utile et la signature du jeton d'identité.

Assurez-vous que l'en-tête du jeton d'identité respecte les contraintes suivantes :

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

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

Revendications de charge utile du jeton d'ID
exp Date/Heure d'expiration Il doit s'agir d'une date future. Le temps est mesuré en secondes depuis l'époque UNIX.
iat Date/Heure d'émission Il doit s'agir d'une date antérieure. Le temps est mesuré en secondes depuis l'époque UNIX.
aud Public visé Il doit s'agir de l'ID de votre projet Firebase, l'identifiant unique de votre projet Firebase, que vous trouverez dans l'URL de la console de ce projet.
iss Émetteur Doit être "https://securetoken.google.com/<projectId>", où <projectId> correspond au même ID de projet que celui utilisé pour aud ci-dessus.
sub Objet Doit être une chaîne non vide et correspondre au uid de l'utilisateur ou de l'appareil.
auth_time Heure d'authentification Il doit s'agir d'une date antérieure. Heure à laquelle l'utilisateur s'est authentifié.

Enfin, assurez-vous que le jeton d'identité a été signé par la clé privée correspondant à la revendication kid du jeton. Récupérez la clé publique à partir de https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com et utilisez une bibliothèque JWT pour valider 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'identité comme uid de l'utilisateur ou de l'appareil correspondant.