Une analyse approfondie de la médiation immédiate de WebAuthn. Découvrez comment elle permet de créer un bouton de connexion unique, d'éviter les QR codes déroutants et de construire un flux de connexion plus intelligent.
Vincent
Created: August 8, 2025
Updated: August 13, 2025
See the original blog version in English here.
60-page Enterprise Passkey Whitepaper:
Learn how leaders get +80% passkey adoption. Trusted by Rakuten, Klarna & Oracle
La transition vers les Passkeys crée un « paradoxe des Passkeys » : certains utilisateurs ont des Passkeys, tandis que beaucoup utilisent encore des mots de passe traditionnels. Cela conduit à des écrans de connexion surchargés avec plusieurs boutons : « Se connecter avec un mot de passe », « Se connecter avec Google » et « Se connecter avec un Passkey ». Cette fragmentation crée des frictions. Un utilisateur peut cliquer sur « Se connecter avec un Passkey » sur un nouvel appareil pour se retrouver face à une invite de QR code déroutante, car son Passkey n'est pas disponible localement. Le problème fondamental est l'incapacité du site web à connaître le contexte de l'utilisateur avant de lancer un flux d'authentification.
Une solution consiste à utiliser une approche « identifier-first » pour déterminer la meilleure méthode de connexion pour l'utilisateur. Une autre solution potentielle est un bouton de connexion unique et intelligent qui orchestre le flux le plus fluide pour chaque utilisateur. Il devrait directement proposer un Passkey si celui-ci est disponible sur l'appareil, ou se rabattre élégamment sur d'autres méthodes dans le cas contraire.
Une nouvelle fonctionnalité WebAuthn a été annoncée qui pourrait rendre cela possible : la
médiation immédiate (mediation: 'immediate'
). En définissant cette propriété dans un
appel à l'API WebAuthn, les développeurs peuvent créer une expérience de connexion
intelligente et unifiée qui résout le paradoxe des Passkeys. Cet article propose une
analyse de mediation: 'immediate'
axée sur les développeurs, en explorant ce que c'est,
comment ça fonctionne et comment l'implémenter.
Recent Articles
📖
WebAuthn pubKeyCredParams & credentialPublicKey : CBOR & COSE
🔑
Passkeys & WebAuthn PRF pour le chiffrement de bout en bout (2025)
📖
Protocole d'échange d'identifiants (CXP) et Format d'échange d'identifiants (CXF) de WebAuthn
📖
Indices de crédential de clé publique WebAuthn / Indices User-Agent
🔑
Méthodes de connexion et d'authentification par QR Code
Pour comprendre la médiation immédiate, il est utile de connaître d'abord les autres options. La médiation utilisateur dans WebAuthn est la manière dont le navigateur gère l'interaction entre votre site web (la Partie de confiance ou Relying Party) et l'authentificateur de l'utilisateur (par exemple, Face ID, YubiKey).
C'est le flux WebAuthn classique et explicite. Lorsqu'une
Partie de confiance (Relying Party) appelle
navigator.credentials.get()
sans spécifier de préférence de mediation
, le navigateur
présente toujours une boîte de dialogue modale. Cette boîte de dialogue se superpose
au contenu de la page, exigeant l'attention immédiate de l'utilisateur et suspendant toute
autre interaction avec le site web.
mediation: 'conditional'
#Introduit pour aider les utilisateurs à passer aux Passkeys, ce mode est plus subtil. Avec
mediation: 'conditional'
, la requête WebAuthn est attachée à un champ de saisie (par
exemple, le nom d'utilisateur) avec l'attribut autocomplete="webauthn"
. Lorsque
l'utilisateur clique sur le champ, l'interface de remplissage automatique du navigateur
suggère les Passkeys disponibles.
mediation: 'immediate'
est la solution au problème du « bouton de connexion unique ».
Elle fournit un moyen fiable pour un site web de vérifier la disponibilité d'un Passkey
avant d'afficher une quelconque interface utilisateur.
Au lieu d'imposer à l'utilisateur de s'authentifier avec un Passkey via une modale, la
médiation immediate
demande au navigateur : « Y a-t-il un Passkey facilement
disponible pour cet utilisateur sur cet appareil maintenant ? »
Point crucial, cette requête ne vérifie que les identifiants disponibles localement (par exemple, les authentificateurs intégrés à l'appareil comme Windows Hello ou les Passkeys synchronisés via un gestionnaire de mots de passe). Elle est conçue pour éviter de déclencher le flux multi-appareils par QR code, qui est un point de friction courant.
La puissance de cette fonctionnalité réside dans son résultat clair et binaire. La
promesse retournée par navigator.credentials.get()
réussira ou échouera, donnant au
développeur un signal clair.
PublicKeyCredential
.navigator.credentials.get()
est immédiatement rejetée avec une
DOMException
nommée NotAllowedError
.L'erreur NotAllowedError
n'est pas un bug. C'est plutôt une fonctionnalité. C'est un
signal fiable et instantané indiquant que le site web doit passer à une méthode
d'authentification de secours. Cela permet aux développeurs
d'utiliser un simple bloc try...catch
: le bloc try
tente le flux Passkey fluide, et
le bloc catch
écoute NotAllowedError
pour afficher un formulaire de connexion
traditionnel. Elle résout élégamment le problème du bouton de connexion unique en créant
un seul point d'entrée qui s'adapte intelligemment au contexte de l'utilisateur.
Choisir le bon mode de médiation est une décision UX essentielle. Ce tableau propose une comparaison directe.
Fonctionnalité / Comportement | Modale (par défaut) | UI conditionnelle (conditional ) | Immédiate (immediate ) |
---|---|---|---|
Appel API | navigator.credentials.get() | navigator.credentials.get({ mediation: 'conditional' }) | navigator.credentials.get({ mediation: 'immediate' }) |
Déclencheur | Action explicite de l'utilisateur (ex: clic sur un bouton) | Chargement de la page ; UI au focus sur le champ de saisie | Action explicite de l'utilisateur (ex: clic sur un bouton) |
Présentation de l'UI | Affiche toujours une boîte de dialogue modale immédiatement. | Affiche une UI non modale, de type remplissage automatique. | Affiche une boîte de dialogue modale uniquement si un identifiant local est trouvé. |
Comportement si aucun identifiant local | Affiche l'UI pour les flux multi-appareils (ex: QR code). | La promesse reste en attente, ne se résout jamais, aucune erreur n'est levée. | La promesse est immédiatement rejetée avec NotAllowedError . |
Information pour le site | N'apprend rien tant que l'utilisateur n'a pas terminé le flux. | N'apprend rien si l'utilisateur n'interagit pas. Confidentialité maximale. | Apprend une seule information (un bit) : l'existence d'un identifiant local. |
Cas d'usage principal | Bouton dédié « Se connecter avec un Passkey ». 2FA explicite. | Formulaires de connexion/inscription unifiés. Amélioration progressive des formulaires de mot de passe. | Un bouton « Se connecter » unique et principal pour une base d'utilisateurs mixte. |
Action du développeur | Gérer le succès ou l'annulation par l'utilisateur. | Gérer le succès. Aucun signal d'échec sur lequel agir. | Gérer le succès ou NotAllowedError pour déclencher une UI de secours. |
Voici un guide pratique, étape par étape, pour implémenter mediation: 'immediate'
.
Comme mediation: 'immediate'
est une nouvelle fonctionnalité, une détection de
fonctionnalité robuste est cruciale.
// La détection de fonctionnalité est essentielle pour l'amélioration progressive. let immediateMediationAvailable = false; if (window.PublicKeyCredential && PublicKeyCredential.getClientCapabilities) { try { const capabilities = await PublicKeyCredential.getClientCapabilities(); // La capacité 'immediateGet' signale le support par le navigateur. immediateMediationAvailable = capabilities.immediateGet === true; } catch (e) { console.error("Erreur lors de l'obtention des capacités du client :", e); } }
navigator.credentials.get()
#Cet appel doit être déclenché par un geste de l'utilisateur, comme le clic sur un bouton.
// Cette fonction devrait être le gestionnaire d'événements pour votre bouton principal « Se connecter ». async function handleSignInClick() { if (!immediateMediationAvailable) { // Se rabattre sur l'affichage d'un formulaire de connexion classique si la fonctionnalité n'est pas prise en charge. showLegacyLoginForm(); return; } try { // Récupérez un nouveau challenge aléatoire depuis votre serveur pour chaque tentative. const challenge = await fetchChallengeFromServer(); const publicKeyCredentialRequestOptions = { challenge: challenge, // Le challenge fourni par le serveur sous forme de Uint8Array rpId: "example.com", // La liste allowCredentials DOIT être vide pour la médiation immédiate // afin de protéger la vie privée de l'utilisateur. allowCredentials: [], }; const credential = await navigator.credentials.get({ publicKey: publicKeyCredentialRequestOptions, // C'est la clé qui active le flux de médiation immédiate. mediation: "immediate", }); // Si la promesse se résout, envoyez l'identifiant à votre serveur pour vérification. await verifyCredentialOnServer(credential); } catch (error) { // Le bloc catch est une partie essentielle du flux de contrôle. handleAuthError(error); } }
NotAllowedError
pour un repli élégant#Le bloc catch
est l'endroit où l'« intelligence » du bouton de connexion unique se
concrétise.
// La gestion de NotAllowedError est la clé du mécanisme de secours. function handleAuthError(error) { // Vérifiez la propriété 'name' de la DOMException. if (error.name === "NotAllowedError") { // C'est le signal attendu pour afficher le formulaire de connexion traditionnel. console.log( "Aucun Passkey local trouvé. Affichage du formulaire de connexion classique.", ); showLegacyLoginForm(); } else { // Ceci gère d'autres erreurs potentielles, comme l'utilisateur qui ferme l'invite. console.error("Erreur d'authentification :", error); } }
Pour une expérience des plus fluides, vous pouvez demander au navigateur de rechercher à
la fois les Passkeys et les mots de passe enregistrés dans la même requête en ajoutant
password: true
.
// Combiner les Passkeys et les mots de passe pour une expérience de connexion vraiment unifiée. const credential = await navigator.credentials.get({ publicKey: publicKeyCredentialRequestOptions, password: true, // Demander au navigateur d'inclure les mots de passe enregistrés. mediation: "immediate", }); // L'objet 'credential' retourné sera soit un PublicKeyCredential // soit un PasswordCredential. Votre logique côté serveur doit gérer les deux.
conditional
en attente (souvent
lancée au chargement de la page) peut bloquer une nouvelle requête immediate
.
Envisagez d'utiliser un AbortController
pour annuler toute requête en attente avant
d'en lancer une nouvelle.allowCredentials
: Le tableau allowCredentials
doit être
vide. Fournir des ID d'identifiants entraînera l'échec de
l'appel. C'est une protection de la vie privée cruciale pour empêcher les sites de
vérifier la présence d'utilisateurs spécifiques et connus.mediation: 'immediate'
a été conçue avec une compréhension claire de ses compromis en
matière de sécurité et de confidentialité.
Le compromis principal est une « fuite d'un bit ». En chronométrant la résolution de la promesse, une Partie de confiance (Relying Party) peut déduire une information d'un bit : si la promesse a été rejetée instantanément (pas d'identifiant local) ou si elle a été retardée (une invite d'interface utilisateur a été affichée car un identifiant local a été trouvé). Le but de cette fuite est de permettre une meilleure expérience utilisateur.
Les concepteurs ont anticipé le potentiel d'abus (par exemple, le suivi des utilisateurs) et ont intégré plusieurs garde-fous non négociables :
allowCredentials
interdite : Le tableau allowCredentials
doit être vide.
Cela empêche un site d'utiliser cette fonctionnalité pour vérifier si un utilisateur
connu spécifique est en visite.iframe
d'une autre origine) pour
empêcher le suivi intersites.Ces mesures d'atténuation garantissent que les garanties de sécurité fondamentales de WebAuthn restent intactes. La cérémonie d'authentification elle-même est inchangée et reste résistante au phishing.
mediation: 'immediate'
est une fonctionnalité avancée de la
spécification WebAuthn de niveau 3, et son déploiement
est en cours. À la mi-2025, une stratégie d'amélioration progressive est essentielle.
Navigateur | Statut | Notes et source |
---|---|---|
Chrome | Essai pour les développeurs | Disponible via le flag experimental-web-platform-features . Suivi du bug. |
Edge | En développement (attendu) | En tant que navigateur basé sur Chromium, le support devrait suivre celui de Chrome. |
Safari (WebKit) | À l'étude | Positions de WebKit sur les standards. Aucun engagement public. |
Firefox (Gecko) | À l'étude | Positions de Mozilla sur les standards. Aucun engagement public. |
Bien que mediation: 'immediate'
fournisse un excellent outil de bas niveau pour un
bouton de connexion plus intelligent, il est important de le distinguer d'une solution
plus large de «
Passkey Intelligence
», comme celle proposée par Corbado. Les deux visent à résoudre le paradoxe des Passkeys
et à augmenter leur adoption, mais ils le font de manières différentes.
Caractéristique | mediation: 'immediate' | Passkey Intelligence (ex: Corbado) |
---|---|---|
Fonctionnement | Un appel API natif du navigateur qui vérifie les Passkeys disponibles localement sur l'appareil actuel. | Un service backend qui collecte et analyse des données sur les appareils des utilisateurs, les authentificateurs et l'historique de connexion à travers les sessions. |
Signal fourni | Un signal simple et binaire : un Passkey local existe (invite UI ) ou n'existe pas (NotAllowedError ). | Des informations riches et contextuelles, par exemple : « Cet utilisateur vient de se connecter avec un mot de passe sur un appareil compatible Passkey qu'il utilise souvent. » |
Avantage clé | Vérification native très rapide avec une surcharge réseau minimale. | Disponibilité universelle, indépendante du support des nouvelles fonctionnalités WebAuthn par le navigateur/OS. Des informations plus approfondies pour une UX plus personnalisée. |
Dépendance principale | Nécessite un support à jour du navigateur et de l'OS, ce qui n'est pas encore universel. | Intégration avec un service backend. |
La Passkey Intelligence va plus loin en collectant et en évaluant des données au fil du temps. Cela permet des interventions utilisateur plus sophistiquées et opportunes. Par exemple, un backend de Passkey Intelligence peut détecter :
Cette approche basée sur les données est indépendante du support de
mediation: 'immediate'
par le navigateur, ce qui signifie qu'elle peut fournir un flux
de connexion plus intelligent pour tous vos utilisateurs, dès maintenant.
Le meilleur des deux mondes
En fin de compte, ces deux approches ne s'excluent pas mutuellement ; elles sont complémentaires. La solution idéale les combine :
mediation: 'immediate'
comme l'un de ses signaux sur
les navigateurs compatibles pour effectuer une vérification initiale rapide.En combinant la vitesse native de mediation: 'immediate'
avec les informations
approfondies d'un backend de
Passkey Intelligence,
vous pouvez offrir l'expérience de connexion la plus fluide, adaptative et efficace
possible, guidant en douceur chaque utilisateur vers un avenir
sans mot de passe.
La médiation immédiate est une excellente amélioration de l'expérience de connexion. Elle fournit l'intelligence nécessaire pour éliminer les points de friction et de confusion courants pour les utilisateurs pendant la transition vers les Passkeys.
immediate
supprime la charge cognitive pour l'utilisateur. Il n'a plus
à se souvenir de la méthode d'authentification qu'il a configurée ni à choisir dans une
liste d'options surchargée. Le processus de connexion devient plus simple et plus
intuitif.mediation: 'immediate'
ne recherche que les
identifiants locaux, elle évite complètement cette situation
déroutante. Au lieu que l'utilisateur abandonne le flux, l'application reçoit un signal
clair (NotAllowedError
) pour se rabattre élégamment sur une autre méthode, ce qui se
traduit par un parcours plus fluide.La médiation immédiate est une nouvelle fonctionnalité de WebAuthn qui résout l'expérience de connexion fragmentée de la période de transition vers les Passkeys. Elle permet de créer un bouton « Se connecter » unique et intelligent qui s'adapte au contexte de l'utilisateur, éliminant ainsi la confusion et les frictions.
Bien qu'elle introduise un compromis calculé en matière de confidentialité, elle inclut des garde-fous robustes pour atténuer les risques sans compromettre la sécurité fondamentale de WebAuthn.
Pour les développeurs, la voie à suivre est l'amélioration progressive. Construisez une
expérience de base solide et ajoutez la médiation immediate
par-dessus pour les
navigateurs compatibles. Adopter cette fonctionnalité est une décision stratégique pour
accélérer l'adoption des Passkeys, renforcer la sécurité, réduire les coûts opérationnels
et améliorer la conversion.
L'implémentation de ces flux d'authentification avancés peut être complexe. La plateforme
Passkey Entreprise de Corbado élimine cette complexité. Notre
infrastructure gère l'orchestration optimale des
flux, y compris la médiation conditionnelle et immediate
, permettant à votre équipe de
déployer en toute confiance une expérience d'authentification de pointe et sans friction.
Enjoyed this read?
🤝 Join our Passkeys Community
Share passkeys implementation tips and get support to free the world from passwords.
🚀 Subscribe to Substack
Get the latest news, strategies, and insights about passkeys sent straight to your inbox.
Related Articles
Table of Contents