Présentation détaillée de userVerification

Ce document explique ce qu'est userVerification dans WebAuthn, ainsi que les comportements du navigateur qui en résultent lorsque userVerification est spécifié lors de la création ou de l'authentification d'une clé d'accès.

Qu'est-ce que la "validation de l'utilisateur" dans WebAuthn ?

Les clés d'accès sont basées sur la cryptographie à clé publique. Lorsqu'une clé d'accès est créée, une paire de clés publique/privée est générée. La clé privée est stockée par le fournisseur de clés d'accès, et la clé publique est renvoyée au serveur de la partie de confiance (RP) pour être stockée. Le serveur peut authentifier un utilisateur en vérifiant une signature signée par la même clé d'accès à l'aide de la clé publique associée. L'indicateur "user present" (UP) sur un identifiant à clé publique prouve qu'une personne a interagi avec l'appareil lors de l'authentification.

La validation de l'utilisateur est une couche de sécurité facultative qui vise à confirmer que la bonne personne était présente lors de l'authentification, et pas seulement une personne quelconque, comme l'affirme la présence de l'utilisateur. Sur les smartphones, cela se fait généralement à l'aide du mécanisme de verrouillage de l'écran, qu'il s'agisse d'une authentification biométrique, d'un code ou d'un mot de passe. L'indicateur "UV" renvoyé dans les données de l'authentificateur lors de l'enregistrement et de l'authentification de la clé d'accès indique si la validation de l'utilisateur a été effectuée.

Capture d'écran d'une boîte de dialogue de validation de l'utilisateur dans le trousseau iCloud sur macOS. La boîte de dialogue invite l'utilisateur à se connecter à l'aide de Touch ID, en affichant l'origine de la demande d'authentification ainsi que le nom d'utilisateur. En haut à droite de la boîte de dialogue se trouve un bouton "Annuler".
Boîte de dialogue de validation de l'utilisateur dans le trousseau iCloud sur macOS.
Capture d'écran d'une boîte de dialogue de validation de l'utilisateur sur Chrome pour Android. La boîte de dialogue invite l'utilisateur à valider son identité à l'aide de la reconnaissance faciale ou de la détection d'empreinte digitale, et affiche l'origine de la demande d'authentification. En bas à gauche, vous trouverez une option permettant de valider votre identité à l'aide d'un code.
Boîte de dialogue de validation de l'utilisateur sur Android Chrome.

Comment le nom d'utilisateur et la vérification de l'utilisateur sont validés sur le serveur

Les indicateurs booléens de présence de l'utilisateur (UP) et d'utilisateur validé (UV) sont signalés au serveur dans le champ de données de l'authentificateur. Lors de l'authentification, le contenu du champ de données de l'authentificateur peut être validé en vérifiant la signature à l'aide de la clé publique stockée. Tant que la signature est valide, le serveur peut considérer les indicateurs comme authentiques.

Représentation de la structure des données d'authentification. De gauche à droite, chaque section de la structure de données se lit comme suit : "HASH DE L'ID du RP" (32 octets), "FLAGS" (1 octet), "COUNTER" (4 octets, uint32 big-endian), "ATTESTE CRED. DATA' (longueur variable si présent) et 'EXTENSIONS' (longueur variable si présent (CBOR)). La section "FLAGS" (SIGNALEMENTS) est développée pour afficher une liste des signalements potentiels, libellés de gauche à droite : "ED", "AT", "0", "BS", "BE", "UV", "0" et "UP".
Champs de données de l'authentificateur dans un identifiant de clé publique.

Lors de l'enregistrement et de l'authentification par clé d'accès, le serveur doit examiner si l'indicateur UP est défini sur true ou false, et si l'indicateur UV est défini sur true ou false, selon les exigences.

Spécifier le paramètre userVerification

Conformément à la spécification WebAuthn, la partie de confiance peut demander une validation de l'utilisateur avec un paramètre userVerification lors de la création et de l'assertion des identifiants. Il accepte 'preferred', 'required' ou 'discouraged', qui signifient respectivement :

  • 'preferred' (par défaut) : l'utilisation d'une méthode de validation de l'utilisateur sur l'appareil est préférable, mais peut être ignorée si elle n'est pas disponible. L'identifiant de réponse contient une valeur d'indicateur UV de true si la validation de l'utilisateur a été effectuée et de false si elle ne l'a pas été.
  • 'required' : l'appel d'une méthode de validation de l'utilisateur disponible sur l'appareil est obligatoire. Si aucun n'est disponible, la requête échoue localement. Cela signifie que les identifiants de réponse sont toujours renvoyés avec l'indicateur UV défini sur true.
  • 'discouraged' : l'utilisation d'une méthode de validation de l'utilisateur est déconseillée. Toutefois, selon l'appareil, la validation de l'utilisateur peut quand même être effectuée, et le flag UV peut contenir true ou false.

Exemple de code pour la création d'une clé d'accès :

const publicKeyCredentialCreationOptions = {
  // ...
  authenticatorSelection: {
    authenticatorAttachment: 'platform',
    residentKey: 'required',
    requireResidentKey: true,
    userVerification: 'preferred'
  }
};

const credential = await navigator.credentials.create({
  publicKey: publicKeyCredentialCreationOptions
});

Exemple de code pour l'authentification par clé d'accès :

const publicKeyCredentialRequestOptions = {
  challenge: /* Omitted challenge data... */,
  rpId: 'example.com',
  userVerification: 'preferred'
};

const credential = await navigator.credentials.get({
  publicKey: publicKeyCredentialRequestOptions
});

Quelle option devez-vous choisir pour userVerification ?

La valeur userVerification à utiliser dépend des exigences de votre application et de vos besoins en termes d'expérience utilisateur.

Dans quel contexte utiliser userVerification='preferred' ?

Utilisez userVerification='preferred' si vous privilégiez l'expérience utilisateur à la protection.

Dans certains environnements, la validation de l'utilisateur est plus une source de friction qu'une protection. Par exemple, sur macOS, lorsque Touch ID n'est pas disponible (parce que l'appareil ne le prend pas en charge, qu'il est désactivé ou qu'il est en mode Clamshell), l'utilisateur est invité à saisir son mot de passe système. Cela crée des frictions, et l'utilisateur peut abandonner complètement l'authentification. Si vous préférez éliminer les frictions, utilisez userVerification='preferred'.

Capture d'écran d'une boîte de dialogue de clé d'accès sur macOS qui s'affiche lorsque Touch ID n'est pas disponible. La boîte de dialogue contient des informations telles que l'origine de la demande d'authentification et le nom d'utilisateur. En haut à droite de la boîte de dialogue se trouve un bouton "Annuler".
Boîte de dialogue de clé d'accès affichée sur macOS lorsque Touch ID n'est pas disponible.

Avec userVerification='preferred', l'indicateur de validation de l'utilisateur est défini sur true si la validation de l'utilisateur est effectuée avec succès et sur false si elle est ignorée. Par exemple, sur macOS où Touch ID n'est pas disponible, il demande à l'utilisateur de cliquer sur un bouton pour ignorer la validation de l'utilisateur. L'identifiant à clé publique inclut un indicateur UV false.

L'indicateur UV peut ensuite servir de signal dans votre analyse des risques. Si la tentative de connexion semble risquée en raison d'autres facteurs, vous pouvez présenter des questions d'authentification supplémentaires à l'utilisateur si la validation de l'utilisateur n'a pas été effectuée.

Dans quel contexte utiliser userVerification='required' ?

Utilisez userVerification='required' si vous pensez que l'UP et l'UV sont absolument nécessaires.

L'inconvénient de cette option est que l'utilisateur peut rencontrer plus de difficultés lors de la connexion. Par exemple, sur macOS, où Touch ID n'est pas disponible, l'utilisateur est invité à saisir le mot de passe de son système.

Avec userVerification='required', vous pouvez vous assurer que la validation de l'utilisateur est effectuée sur l'appareil. Assurez-vous que le serveur vérifie que le signalement pour contenu non souhaité est défini sur true.

Conclusion

En tirant parti de la validation de l'utilisateur, les tiers de confiance utilisant des clés d'accès peuvent évaluer la probabilité que le propriétaire de l'appareil se connecte. Ils peuvent choisir de rendre la validation de l'utilisateur obligatoire ou facultative, selon l'impact du mécanisme de connexion de secours sur le parcours utilisateur. Assurez-vous que le serveur vérifie les indicateurs UP et UV pour l'authentification des utilisateurs avec clé d'accès.