Assurer la cohérence des clés d'accès avec les identifiants sur votre serveur avec l'API Signal

Publié le 12 novembre 2024

L'API WebAuthn Signal permet aux parties de confiance de signaler les identifiants existants aux fournisseurs de clés d'accès connectés. Ainsi, un fournisseur de clés d'accès compatible peut mettre à jour ou supprimer de son espace de stockage les clés d'accès incorrectes ou révoquées afin qu'elles ne soient plus proposées aux utilisateurs.

Compatibilité

Chrome pour ordinateur est compatible avec l'API Signal à partir de Chrome 132. Le Gestionnaire de mots de passe de Google peut mettre à jour les clés d'accès en fonction du signal. Pour les fournisseurs de clés d'accès basés sur des extensions Chrome, il leur appartient de refléter ou non le signal.

La compatibilité avec Chrome sur Android sera disponible ultérieurement.

Safari est compatible, mais n'est pas encore implémenté. Firefox n'a pas encore partagé son avis.

Contexte

Lorsqu'une clé d'accès (identifiant détectable) est créée, des métadonnées telles qu'un nom d'utilisateur et un nom à afficher sont enregistrées auprès du fournisseur de clés d'accès (par exemple, un gestionnaire de mots de passe) avec la clé privée, tandis que les identifiants de clé publique sont enregistrés sur le serveur de la partie de confiance (RP). L'enregistrement du nom d'utilisateur et du nom à afficher permet à l'utilisateur d'identifier la clé d'accès à utiliser pour se connecter lorsqu'il y est invité. Cela est particulièrement utile lorsqu'il dispose de plus de deux clés d'accès provenant de différents fournisseurs de clés d'accès.

Toutefois, dans certains cas, des incohérences entre la liste de clés d'accès du fournisseur de clés d'accès et la liste d'identifiants du serveur peuvent prêter à confusion.

Le premier cas se produit lorsqu'un utilisateur supprime des identifiants sur le serveur, mais laisse la clé d'accès dans le fournisseur de clés d'accès. La prochaine fois que l'utilisateur tentera de se connecter avec une clé d'accès, celle-ci lui sera toujours présentée par le fournisseur de clés d'accès. Toutefois, la tentative de connexion échouera, car le serveur ne pourra pas valider la clé publique supprimée.

Le second cas se produit lorsqu'un utilisateur modifie son nom d'utilisateur ou son nom à afficher sur le serveur. La prochaine fois que l'utilisateur tentera de se connecter, la clé d'accès du fournisseur de clés d'accès continuera d'afficher l'ancien nom d'utilisateur et le nom à afficher, même s'ils ont été mis à jour sur le serveur. Idéalement, ils doivent être synchronisés.

API Signal

L'API Signal est une API WebAuthn qui résout ces confusions en permettant aux RP de signaler les modifications apportées au fournisseur de clés d'accès. Il existe trois méthodes:

Signaler qu'un identifiant n'existe pas

const credential = await navigator.credentials.get({ ... });
const payload = credential.toJSON();

const result = await fetch('/login', { ... });

// Detect authentication failure due to lack of the credential
if (result.status === 404) {
  // Feature detection
  if (PublicKeyCredential.signalUnknownCredential) {
    await PublicKeyCredential.signalUnknownCredential({
      rpId: "example.com",
      credentialId: "vI0qOggiE3OT01ZRWBYz5l4MEgU0c7PmAA" // base64url encoded credential ID
    });
  } else {
    // Encourage the user to delete the passkey from the password manager nevertheless.
    ...
  }
}

En appelant PublicKeyCredential.signalUnknownCredential() avec un ID de RP et un ID d'identifiant, le RP peut informer le fournisseur de clés d'accès que l'identifiant spécifié a été supprimé ou qu'il n'existe pas. C'est au fournisseur de clés d'accès de gérer ce signal, mais la clé d'accès associée doit être supprimée pour que l'utilisateur ne se connecte pas avec une clé d'accès, car les identifiants associés n'existent pas.

Cette API peut être appelée lorsque la connexion basée sur une clé d'accès a échoué en raison de l'absence d'identifiants. De cette manière, le RP peut empêcher l'utilisateur de tenter de se connecter avec une clé d'accès qui n'a pas d'identifiants associés. Contrairement à signalAllAcceptedCredentials, cette méthode ne nécessite pas de transmettre la liste complète des ID d'identifiants. Elle doit donc être utilisée chaque fois que l'utilisateur n'est pas authentifié pour éviter de révéler le nombre de clés d'accès d'un utilisateur donné.

Boîte de dialogue affichée lorsqu'une clé d'accès est supprimée du Gestionnaire de mots de passe de Google dans Chrome.
Fenêtre de dialogue affichée lorsqu'une clé d'accès est supprimée du Gestionnaire de mots de passe de Google dans Chrome.

Signaler une liste d'identifiants enregistrés

// After a user deletes a passkey or a user is signed in.

// Feature detection
if (PublicKeyCredential.signalAllAcceptedCredentials) {
  await PublicKeyCredential.signalAllAcceptedCredentials({
    rpId: "example.com",
    userId: "M2YPl-KGnA8", // base64url encoded user ID
    allAcceptedCredentialIds: [ // A list of base64url encoded credential IDs
      "vI0qOggiE3OT01ZRWBYz5l4MEgU0c7PmAA",
      ...
    ]
  });
}

En appelant PublicKeyCredential.signalAllAcceptedCredentials() avec un ID de RP, un ID utilisateur et une liste d'ID d'identifiants des identifiants stockés, le RP peut informer le fournisseur de clés d'accès des identifiants restants dans son stockage. C'est au fournisseur de clés d'accès de gérer ce signal, mais les clés d'accès qui ne correspondent pas à cette liste doivent être supprimées afin que l'utilisateur ne voie pas de clés d'accès lors de la connexion pour lesquelles les identifiants associés n'existent pas.

Cette API doit être appelée lorsqu'un utilisateur supprime une clé d'accès sur le RP et à chaque connexion, afin que le fournisseur de clés d'accès puisse conserver une liste synchronisée de clés d'accès.

Signaler la mise à jour du nom d'utilisateur et du nom à afficher

// After a user updated their username and/or display name
// or a user is signed in.

// Feature detection
if (PublicKeyCredential.signalCurrentUserDetails) {
  await PublicKeyCredential.signalCurrentUserDetails({
    rpId: "example.com",
    userId: "M2YPl-KGnA8", // base64url encoded user ID
    name: "a.new.email.address@example.com", // username
    displayName: "J. Doe"
  });
} else {
}

En appelant PublicKeyCredential.signalCurrentUserDetails() avec un ID de RP, un ID utilisateur, un nom d'utilisateur et un nom à afficher, le RP peut informer le fournisseur de clés d'accès des informations utilisateur mises à jour. C'est au fournisseur de clés d'accès de gérer ce signal, mais les clés d'accès dont l'utilisateur est propriétaire doivent être mises à jour avec les nouvelles informations utilisateur.

Cette API peut être appelée lorsque le nom d'utilisateur ou le nom à afficher de l'utilisateur est mis à jour et à chaque connexion, afin que le fournisseur de clés d'accès puisse synchroniser ces informations avec le serveur.

Boîte de dialogue affichée lorsqu'une métadonnées de clé d'accès est mise à jour dans le Gestionnaire de mots de passe de Google sur Chrome.
Boîte de dialogue affichée lorsqu'une métadonnées de clé d'accès est mise à jour dans le Gestionnaire de mots de passe de Google sur Chrome.

Résumé

L'API Signal vous aide à créer une meilleure expérience de clé d'accès en éliminant les risques de défaillance de connexion inattendue. Avec l'API Signal, les parties de confiance peuvent signaler la liste des identifiants existants et leurs métadonnées afin de synchroniser les clés d'accès sur le fournisseur de clés d'accès.

Pour en savoir plus sur les clés d'accès, consultez Connexion sans mot de passe à l'aide de clés d'accès.