Cette page a été traduite automatiquement. Consultez la version originale en anglais ici.

Aide-mémoire Passkeys. Conseils pratiques, modèles de déploiement et KPIs pour les programmes passkeys.
isConditionalMediationAvailable() doit être appelé avant de démarrer tout flux de Conditional
UI pour éviter les erreurs visibles par l'utilisateur sur les navigateurs ou appareils non pris en charge.autocomplete="username webauthn" sur un champ de saisie HTML signale au
navigateur d'afficher les clés d'accès (passkeys) aux côtés des suggestions de mots de passe dans le menu déroulant de remplissage automatique.mediation: "conditional" dans l'appel navigator.credentials.get()
active le remplissage automatique des clés d'accès sans interrompre les utilisateurs avec une boîte de dialogue modale bloquante.AbortController est requis pour annuler les requêtes de Conditional UI en cours car
les menus de remplissage automatique, contrairement aux invites modales, n'ont pas de bouton d'annulation intégré.Avec l'adoption rapide des clés d'accès (et du protocole WebAuthn sous-jacent), l'authentification est devenue plus sécurisée et conviviale pour de nombreux utilisateurs. L'une des avancées marquantes des clés d'accès a été l'intégration de la Conditional UI, souvent appelée « remplissage automatique des clés d'accès » ou Conditional Mediation (dans la suite, nous conserverons le terme Conditional UI).
Malgré son introduction récente et son adoption continue par les navigateurs, il y a un manque notable dans la documentation technique et les conseils d'implémentation pour la Conditional UI. Cet article vise à combler ce vide en expliquant ce qu'est la Conditional UI, comment elle fonctionne et comment résoudre les défis courants lors de son implémentation.
Articles récents
⚙️
Aide-mémoire sur les clés d'accès pour les développeurs
👤
Comment supprimer une clé d'accès sur Apple, Windows et Android
📖
Explication technique de la Conditional UI WebAuthn
📖
Guide ultime des erreurs WebAuthn en production (2026)
📖
Clés d'accès dans le navigateur Brave (2026) : Ce qui fonctionne et ce qui casse
La Conditional UI représente un nouveau mode pour les processus de connexion par clés d'accès / WebAuthn. Elle affiche de manière sélective les clés d'accès dans une interface utilisateur (UI) uniquement lorsqu'un utilisateur possède un identifiant découvrable (clé résidente), qui est un type de clé d'accès, enregistré auprès de la partie utilisatrice (le service en ligne) et stocké dans l'authentificateur de son appareil (par ex. ordinateur portable, smartphone). Les clés d'accès sont affichées dans un menu déroulant de sélection mélangé aux mots de passe remplis automatiquement, offrant une transition fluide entre les systèmes de mots de passe traditionnels et l'authentification avancée par clés d'accès, car les utilisateurs voient les deux dans le même contexte. Cette approche intelligente garantit que les utilisateurs ne sont pas submergés d'options inutiles et peuvent naviguer dans le processus de connexion plus fluidement.
Igor Gjorgjioski
Head of Digital Channels & Platform Enablement, VicRoads
We hit 80% mobile passkey activation across 5M+ users without replacing our IDP.
See how VicRoads scaled passkeys to 5M+ users — alongside their existing IDP.
Read the case studyLa base de la Conditional UI repose sur trois piliers principaux :
Abonnez-vous à notre Substack passkeys pour les dernières actualités.
Dans la suite, nous fournissons une ventilation étape par étape des étapes individuelles d'un flux complet de Conditional UI :
En général, le flux de processus de la Conditional UI peut être divisé en deux phases. Pendant la phase de chargement de la page, la logique de la Conditional UI se produit en arrière-plan, tandis que dans la phase d'opération utilisateur, l'utilisateur doit activement faire quelque chose.
isConditionalMediationAvailable() pour détecter si la combinaison actuelle navigateur / appareil
prend en charge la Conditional UI. Ce n'est que si la réponse est vraie que le processus
continue, sinon le processus de la Conditional UI est annulé.credentials.get() avec les
PublicKeyCredentialRequestOptions reçues et
la propriété mediation définie pour être conditionnelle, le processus pour l'authentification
locale sur l'appareil démarre.En suivant ce flux de processus, la Conditional UI offre une expérience d'authentification fluide et conviviale.
Pour faire fonctionner la Conditional UI, certains aspects généraux doivent être pris en compte :
Rejoignez notre communauté passkeys pour les mises à jour et le support.
Pour faire fonctionner la Conditional UI côté client, les exigences suivantes doivent être remplies :
isConditionalMediationAvailable() et de vérifier la
disponibilité technique de la Conditional UI (voir ci-dessous pour
plus de détails).Pour faire fonctionner la Conditional UI, certaines exigences côté serveur doivent également être remplies :
Depuis le déploiement officiel de la Conditional UI fin 2022 et les versions bêta antérieures, nous l'avons testée et avons beaucoup travaillé avec. Dans la suite, nous souhaitons partager avec vous des conseils pratiques qui ont aidé lors de l'implémentation de la Conditional UI.
Expérimentez les parcours passkey dans le Passkeys Debugger.
Un exemple de code minimaliste et complet pour une méthode de Conditional UI ressemblerait à ceci :
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Conditional UI</title> </head> <body> <input type="text" id="username" autocomplete="username webauthn" /> <script> async function passkeyLogin() { try { // retrieve the request options (incl. the challenge) from the WebAuthn server let options = await WebAuthnClient.getPublicKeyRequestOptions(); const credential = await navigator.credentials.get({ publicKey: options.publicKeyCredentialRequestOptions, mediation: "conditional", }); const userData = await WebAuthnClient.sendSignedChallenge(credential); window.location.href = "/logged-in"; } catch (error) { console.log(error); } } passkeyLogin(); </script> </body> </html>
Implémentez une détection de la Conditional UI qui garantit que la Conditional UI n'est utilisée que lorsque
la combinaison actuelle appareil / navigateur la prend en charge. Cela devrait fonctionner sans présenter
d'erreurs visibles par l'utilisateur en l'absence de prise en charge de la Conditional UI. L'intégration de la
méthode isConditionalMediationAvailable() dans l'interface utilisateur répond à cette
préoccupation. Si la prise en charge de la Conditional UI est confirmée, le processus de connexion par Conditional UI peut être
démarré.
// source: https://developer.mozilla.org/en-US/docs/Web/API/PublicKeyCredential/isConditionalMediationAvailable#examples // Availability of `window.PublicKeyCredential` means WebAuthn is usable. if (window.PublicKeyCredential && PublicKeyCredential.isConditionalMediationAvailable) { // Check if conditional mediation is available. const isCMA = await PublicKeyCredential.isConditionalMediationAvailable(); if (isCMA) { // Call WebAuthn authentication start endpoint let options = await WebAuthnClient.getPublicKeyRequestOptions(); const credential = await navigator.credentials.get({ publicKey: options.publicKeyCredentialRequestOptions, mediation: "conditional", }); /* ... */ } }
Le champ de saisie doit recevoir un jeton de remplissage automatique HTML webauthn. Cela signale au client de remplir les clés d'accès à la demande en cours. Outre les clés d'accès, d'autres valeurs de remplissage automatique peuvent également être présentées. Ces jetons de remplissage automatique peuvent être associés à d'autres jetons existants, par ex. :
autocomplete="username webauthn" : Outre l'affichage des clés d'accès, cela suggère également
le remplissage automatique du nom d'utilisateur.autocomplete="current-password webauthn" : Outre l'affichage des clés d'accès, cela
propose également le remplissage automatique du mot de passe.<label for="name">Username:</label> <input type="text" name="name" autocomplete="username webauthn" /> <label for="password">Password:</label> <input type="password" name="password" autocomplete="current-password webauthn" />
Pour plus de détails, nous recommandons de lire cet article de blog qui fournit plus de détails sur les jetons de remplissage / saisie automatique pour les clés d'accès et les mots de passe.
Pour récupérer les clés d'accès disponibles après avoir reçu l'objet PublicKeyCredentialRequestOptions,
la fonction navigator.credentials.get() doit être appelée (qui sert à la fois les
clés d'accès et les mots de passe). L'objet PublicKeyCredentialRequestOptions doit avoir le
paramètre de médiation (mediation) défini sur conditionnel (conditional) pour activer la Conditional UI sur le client. Pour les cas
où vous souhaitez plutôt une invite de clé d'accès modale, consultez
la médiation immédiate.
const credential = await navigator.credentials.get({ publicKey: options.publicKeyCredentialRequestOptions, mediation: "conditional", });
S'il n'y a pas de clé d'accès disponible, ou si l'utilisateur ignore les clés d'accès suggérées et saisit son e-mail, le flux de la Conditional UI est arrêté. Cela souligne l'importance de toujours prendre en charge également la connexion classique par clé d'accès / WebAuthn via une modale.
Un point critique à souligner ici est la nécessité potentielle d'interrompre une requête de Conditional UI en cours. Contrairement aux expériences modales, les menus de remplissage automatique n'ont pas de bouton d'annulation. Selon la conception de WebAuthn, une seule requête d'identifiant active doit être en cours à un moment donné. La norme WebAuthn suggère d'utiliser un AbortController pour annuler un processus WebAuthn, applicable aux processus de connexion réguliers et de Conditional UI (voir ici pour plus de détails).
Dans la télémétrie de production, ce chemin d'annulation est souvent un résultat attendu du flux de contrôle, et non une défaillance du système. Si vous observez de grands volumes d'erreurs, vous devez classer les cas attendus par rapport aux cas inattendus selon le type d'opération et le timing avant de les traiter comme des régressions (voir les erreurs WebAuthn).
Le processus de connexion par Conditional UI est activé dès qu'un utilisateur arrive sur la page. La
tâche initiale devrait être de créer un objet AbortController à portée globale. Cela agira
comme un signal pour votre client afin de terminer la demande de remplissage automatique, surtout si l'utilisateur
décide de suivre le processus régulier de connexion par clé d'accès.
Assurez-vous que l'AbortController peut être invoqué par d'autres fonctions et est réinitialisé si le
processus de la Conditional UI doit redémarrer. Utilisez la propriété signal dans
l'appel navigator.credentials.get(), en incorporant le signal de votre AbortController comme
valeur. Cela signale à la fonction clé d'accès / WebAuthn que la requête doit être interrompue si
le signal est annulé. N'oubliez pas de configurer un nouvel AbortController chaque fois que vous
déclenchez la Conditional UI. L'utilisation d'un AbortController déjà annulé entraînera une annulation
instantanée de la fonction clé d'accès / WebAuthn. Les étapes restantes s'alignent sur un processus
régulier de connexion par clé d'accès. Ci-dessous, vous voyez un
exemple de code des étapes mentionnées :
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Conditional UI</title> </head> <body> <input type="text" id="username" autocomplete="username webauthn" /> <script> async function passkeyLogin() { try { // retrieve the request options (incl. the challenge) from the WebAuthn server let options = await WebAuthnClient.getPublicKeyRequestOptions(); const credential = await navigator.credentials.get({ publicKey: options.publicKeyCredentialRequestOptions, mediation: "conditional", }); const userData = await WebAuthnClient.sendSignedChallenge(credential); window.location.href = "/logged-in"; } catch (error) { console.log(error); } } passkeyLogin(); </script> </body> </html>
En l'absence de prise en charge de la Conditional UI, dirigez les utilisateurs vers le processus classique de connexion par clé d'accès. Offrir ce chemin est important pour les utilisateurs s'appuyant sur des clés de sécurité matérielles (par ex. YubiKeys) ou ceux contraints d'utiliser des clés non résidentes / identifiants non découvrables en raison des contraintes de l'authentificateur.
Découvrez combien de personnes utilisent réellement les passkeys.
Lorsque vous développez une application native, par ex. pour iOS ou Android, la Conditional UI fonctionne également. Peu importe si vous l'implémentez de manière native dans Flutter, Kotlin ou Swift, ou si vous décidez d'utiliser les Chrome Custom Tabs (CCT) ou SFSafariViewController ou SFAuthenticationSession / ASWebAuthenticationSession. Les deux approches prennent en charge la Conditional UI.
En général, nous n'avons trouvé presque aucune documentation sur la façon d'implémenter la prise en charge de la Conditional UI pour les applications iOS. Lors de nos recherches, cependant, nous avons découvert deux façons d'ajouter la prise en charge de la Conditional UI à une application iOS, car l'expérience utilisateur différera également.
Type A : Superposition / Popup sur presque tout l'écran
Le premier type A montre une superposition / popup qui s'étend sur presque tout l'écran. Ici, vous verrez toutes les clés d'accès disponibles pour cette partie utilisatrice. Un exemple marquant qui implémente la Conditional UI de cette manière est KAYAK. La superposition / popup apparaît automatiquement, lorsque l'utilisateur ouvre le bon écran.
Type B : Remplissage automatique du clavier
Le second type B affiche une clé d'accès appropriée dans la section de remplissage automatique du clavier
(où des mots de passe sont également suggérés pour le remplissage automatique). Cliquer sur la valeur suggérée effectuera
l'authentification Face ID et vous permettra de vous connecter. Dans la
version actuelle de l'application iOS du panel développeur Corbado, nous l'avons implémenté de cette manière
(voir le message de connexion par clé d'accès pour <relying party ID> avec le nom d'utilisateur WebAuthn). Pour qu'il s'affiche, l'utilisateur doit appuyer dans le champ de saisie :
Cette fonctionnalité de remplissage automatique des clés d'accès dans la section du clavier peut rencontrer des problèmes lorsque l'iOS est fraîchement installé car apparemment une sorte de mise en cache se produit en arrière-plan et recherche toutes les clés d'accès disponibles pour cette partie utilisatrice.
Cliquer sur l'icône de clé à droite de la clé d'accès suggérée mène au site connu pour le choix des mots de passe / clés d'accès sous iOS :
Veuillez noter que nous n'avons pas trouvé de documentation officielle, et nos informations sont basées sur nos expériences et hypothèses plutôt que sur une preuve concrète de l'implémentation adéquate.
Sur Android, l'histoire de la Conditional UI est un peu plus claire, car il n'y a qu'un seul type pour la Conditional UI / remplissage automatique de clés d'accès qui exploite l'API Credential Manager d'Android (voir la documentation ici). Parce que les fournisseurs Android peuvent différer, surveillez les erreurs de clés d'accès du Credential Manager séparément des modèles d'échec WebAuthn uniquement sur navigateur.
Ouvrir la page où la Conditional UI est implémentée affiche l'écran suivant, où vous trouverez différentes façons de vous connecter :
Cliquer sur More saved sign-ins (Plus de connexions enregistrées) fournit plus d'options pour choisir la connexion (y compris l'authentification multi-appareils et la sélection d'une plateforme de synchronisation de clés d'accès différente, par ex. Samsung Pass ou 1Password) :
Pour illustrer à quoi ressemble la Conditional UI pour l'utilisateur final, nous avons ajouté plusieurs captures d'écran d'un menu de remplissage automatique de la Conditional UI en utilisant https://passkeys.eu.
Testez les passkeys dans une démo en direct.
Jetons un coup d'œil à quelques scénarios courants dans les applications de la vie réelle.
Si aucune clé d'accès n'est enregistrée pour un site, la Conditional UI se comportera différemment selon le navigateur et le système d'exploitation.
Sur Chrome sous macOS, cliquer dans le champ de saisie affiche un menu déroulant de remplissage automatique vide :
Sur Safari sous macOS, aucun menu déroulant n'est affiché - juste une icône discrète dans le champ de saisie :
Sur Android ou iOS, l'interface de remplissage automatique n'apparaît que si l'utilisateur appuie dans le champ et que l'OS trouve des identifiants correspondants.
Cette variabilité est intentionnelle et fait partie du modèle de confidentialité de WebAuthn : les sites web ne peuvent pas détecter si l'utilisateur possède une clé d'accès à moins que l'utilisateur n'en sélectionne activement une.
Si un utilisateur a installé plusieurs fournisseurs de clés d'accès (par ex. Trousseau iCloud, Google Password Manager, 1Password), le navigateur ou l'OS va généralement utiliser par défaut le gestionnaire d'identifiants principal de l'utilisateur.
Pour une liste des différents fournisseurs de clés d'accès / gestionnaires d'identifiants prenant en charge les clés d'accès, nous vous recommandons de consulter le lien GitHub suivant.
Sur Android, le Credential Manager expose différents fournisseurs comme Samsung Pass ou 1Password.
Sur iOS, l'icône de clé ouvre la liste complète des clés d'accès de diverses sources.
En tant qu'application ou site web, vous ne pouvez pas contrôler quel gestionnaire d'identifiants est utilisé - l'OS gère ce choix pour préserver la vie privée des utilisateurs.
Les clés d'accès, avec leur capacité de Conditional UI / remplissage automatique, constituent la nouvelle façon de s'authentifier en ligne. Alors que nous passons à une ère où les mots de passe sont de plus en plus remplacés par des clés d'accès, le besoin de mécanismes de transition robustes et conviviaux est indéniable. Cet article a aidé à comprendre comment implémenter correctement la Conditional UI, une grande aide dans le processus de transition, et sur quels aspects porter une attention particulière.
Corbado est la Authentication Intelligence Platform pour les équipes CIAM qui gèrent l'authentification client à grande échelle. Nous vous montrons ce que les logs IDP et les outils d'analytics génériques ne voient pas : quels appareils, versions d'OS, navigateurs et gestionnaires de credentials prennent en charge les passkeys, pourquoi les enrôlements ne deviennent pas des connexions, où le flux WebAuthn échoue et quand une mise à jour OS ou navigateur casse silencieusement la connexion — le tout sans remplacer Okta, Auth0, Ping, Cognito ni votre IDP interne. Deux produits : Corbado Observe ajoute l'observabilité pour les passkeys et toute autre méthode de connexion. Corbado Connect apporte des passkeys managés avec analytics intégrés (aux côtés de votre IDP). VicRoads gère les passkeys pour plus de 5M d'utilisateurs avec Corbado (+80 % d'activation passkey). Parler à un expert Passkey →
Appelez PublicKeyCredential.isConditionalMediationAvailable() et ne continuez que si cela
renvoie true (vrai). Cette vérification évite des erreurs visibles par l'utilisateur sur les combinaisons de navigateurs et d'appareils non prises en charge. La méthode doit être évaluée à chaque chargement de page avant d'appeler
navigator.credentials.get() avec mediation: "conditional".
Les authentificateurs ne stockent les données spécifiques à l'utilisateur, telles que le nom et le nom d'affichage, que pour les clés résidentes (identifiants découvrables). Les clés non résidentes ne conservent pas ces informations, le menu de remplissage automatique ne peut donc pas renseigner les détails du compte à sélectionner par l'utilisateur.
Le comportement varie selon la plateforme. Chrome sous macOS affiche une liste déroulante de remplissage automatique vide, Safari sous macOS affiche uniquement une icône discrète dans le champ de saisie, et sur Android ou iOS, l'interface de remplissage automatique n'apparaît que si l'OS trouve des identifiants correspondants après que l'utilisateur a appuyé sur le champ. Cette variabilité est intentionnelle et fait partie du modèle de confidentialité de WebAuthn : les sites web ne peuvent pas détecter si une clé d'accès existe à moins que l'utilisateur n'en sélectionne activement une.
Créez un AbortController à portée globale et passez son signal à
navigator.credentials.get(). Appelez .abort() sur le contrôleur lorsque l'utilisateur initie un flux
de connexion modale. Instanciez toujours un nouvel AbortController chaque fois que la Conditional UI
redémarre, car la réutilisation d'un contrôleur déjà annulé provoque l'annulation immédiate de la requête WebAuthn.
La Conditional UI fonctionne à la fois dans les applications natives iOS et Android. iOS prend en charge deux variantes : une popup en superposition plein écran et une suggestion de remplissage automatique au clavier. Android utilise l'API Credential Manager, qui peut afficher les clés d'accès de multiples fournisseurs tels que Samsung Pass ou 1Password.
Articles associés
Table des matières