Présentation détaillée de userVerification

Ce document explique ce qu'est userVerification dans WebAuthn et 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 "vérification de l'utilisateur" dans WebAuthn ?

Les clés d'accès reposent sur la cryptographie à clé publique. Lorsque vous créez une clé d'accès, 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 prenante (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 "utilisateur présent" (UP) sur un identifiant de 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 à affirmer que la bonne personne était présente lors de l'authentification, et non n'importe qui, comme le fait 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 empreinte biométrique, d'un code ou d'un mot de passe. L'état de la validation de l'utilisateur est indiqué dans 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.

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 dans 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 pouvez valider l'opération à l'aide d'un code.
Dialogue de validation de l'utilisateur dans Chrome pour Android.

Comment les autorisations d'accès et d'utilisation sont-elles validées sur le serveur ?

Les indicateurs booléens "user presence" (présence de l'utilisateur) et "user verified" (utilisateur authentifié) 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.

Illustration de la structure des données d'authentification. De gauche à droite, chaque section de la structure de données se lit comme suit : "RP ID HASH" (32 octets), "FLAGS" (1 octet), "COUNTER" (4 octets, uint32 big-endian), "ATTESTE CRED. "DATA" (longueur variable si présente) et "EXTENSIONS" (longueur variable si présente (CBOR)). La section "FLAGS" (INDICATEURS) se développe pour afficher une liste d'indicateurs potentiels, de gauche à droite: "ED", "AT", "0", "BS", "BE", "UV", "0" et "UP".
Champs de données d'Authenticator dans des identifiants de clé publique.

Lors de l'enregistrement et de l'authentification de la clé d'accès, le serveur doit vérifier que l'indicateur UP est true et que l'indicateur UV est true ou false, selon les exigences.

Spécifier le paramètre userVerification

Conformément à la spécification WebAuthn, le RP peut demander une validation de l'utilisateur avec un paramètre userVerification à la fois pour la création et l'assertion des identifiants. Il accepte 'preferred', 'required' ou 'discouraged', ce qui signifie respectivement:

  • 'preferred' (par défaut): il est recommandé d'utiliser une méthode de validation de l'utilisateur sur l'appareil, mais vous pouvez l'ignorer 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': nous déconseillons d'utiliser une méthode de validation des utilisateurs. Toutefois, selon l'appareil, la validation de l'utilisateur peut être effectuée de toute façon, et l'indicateur 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, ainsi que 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 des utilisateurs est plus contraignante que protectrice. Par exemple, sur macOS, où Touch ID n'est pas disponible (parce que l'appareil n'est pas compatible, qu'il est désactivé ou qu'il est en mode clamshell), l'utilisateur est invité à saisir son mot de passe système à la place. Cela entraîne des frictions, et l'utilisateur peut abandonner l'authentification complètement. Si l'élimination des frictions est plus importante pour vous, 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, 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 clé d'accès affichée sur macOS lorsque Touch ID n'est pas disponible.

Avec userVerification='preferred', l'indicateur UV est true si la validation de l'utilisateur est effectuée avec succès et false si la validation de l'utilisateur est ignorée. Par exemple, sous macOS, où Touch ID n'est pas disponible, l'utilisateur est invité à cliquer sur un bouton pour ignorer la validation de l'identité, et les identifiants de clé publique incluent un indicateur UV false.

L'indicateur UV peut ensuite être utilisé comme 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 les deux sont absolument nécessaires.

L'inconvénient de cette option est que l'utilisateur peut rencontrer plus de frictions lors de la connexion. Par exemple, sur macOS, où Touch ID n'est pas disponible, l'utilisateur est invité à saisir son mot de passe 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 l'indicateur UV est true.

Conclusion

En exploitant 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. Il peut choisir d'exiger la validation de l'utilisateur ou de la rendre facultative en fonction de l'impact du mécanisme de connexion de remplacement sur le parcours utilisateur. Assurez-vous que le serveur vérifie les indicateurs UP et UV pour l'authentification utilisateur par clé d'accès.