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.

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 sur Android Chrome. 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.

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.
Champs de données de l'authentificateur dans un identifiant à clé publique. 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".

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

Spécifiez 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 de flag 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 l'identifiant de réponse est toujours renvoyé 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 l'élimination des frictions est plus importante pour vous, utilisez userVerification='preferred'.

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

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.

Le signalement d'un utilisateur non validé peut ensuite être utilisé 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 flag UV est défini sur true.

Conclusion

Grâce à la validation de l'utilisateur, les tiers de confiance pour les 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.