FIDO. Après cinq ans d’existence, qu’en est-il de leur utilisation au quotidien ? Si les grands noms du web ont commencé à mettre à disposition ce nouveau mode d’authentification, leur usage dans les applications reste tout de même en marge. Cette technologie est pourtant censée être accessible et facile d’implémentation. Nous allons vérifier au cours de cet article à quel point cela est vrai.
Notre choix d’implémentation se porte sur les deux serveurs d’authentification phares utilisés chez Octo, la solution Saas Auth0 et la solution open source Keycloak. Quand vient le moment de faire le choix idéal pour gérer les identités et les accès des utilisateurs, nous recommandons toujours de se tourner vers un partenaire avec une solution éprouvée plutôt que de partir sur une implémentation maison, et ces deux là ont fait leur preuve depuis longtemps !
L’utilisation des passkeys permet à un utilisateur de s'inscrire à un service puis de se connecter sans jamais avoir à produire de mot de passe. La passkey se compose d’une clef publique et d’une clef privée. La clef privée sera stockée de manière sécurisée sur un des appareils de l’utilisateur final, tandis que la clef publique sera enregistrée dans le serveur d’authentification du service. Lors de l’enregistrement d’un nouveau compte, il sera proposé à l’utilisateur de générer une passkey sur un appareil compatible de son choix (navigateur web, smartphone, trousseau iCloud…).
Lors d’une tentative de connexion, une chaîne de caractère aléatoire (code challenge) est émise par le serveur d’authentification vers le client de l’utilisateur. Ce dernier est alors invité à se connecter à l’aide de sa clef enregistrée. La clef privée permet de signer le code challenge avant de le renvoyer au serveur d’authentification. La clef publique peut alors vérifier que le message a bien été signé par la clef privée dont elle est dérivée. Cette notion de signature est un procédé de cryptographie asymétrique. Aucune donnée sensible ne circule au cours de ces échanges.
> 💡 Remarque : Dans le cas ou l’Authentificator et le Client sont sur deux appareils distincts (par exemple, un ordinateur et un téléphone), il est nécessaire que le Bluetooth soit activé sur les deux terminaux pour garantir un échange sécurisé des données cryptographiques et vérifier la proximité des dispositifs. Cette norme n’est pas précisée dans la spec, cependant elle est fortement poussée par les constructeurs Google, Apple et Microsoft.
Si vous voulez en savoir plus sur les fondamentaux de cette technologie et ses avantages, nous vous invitons à vous référer à cet article du blog qui fait état du fonctionnement détaillé des passkeys.
Depuis la publication de l’article en 2019, la majorité des nouveaux smartphones sont compatibles WebAuthn.
Auth0 étant un service en ligne, il est nécessaire que vous possédiez un compte utilisateur afin de configurer un environnement d’authentification auprès d’eux. Pas besoin de compte payant pour cela ! Lien d’inscription à Auth0
Lors de votre première connexion, Auth0 vous propose de créer une nouvelle application. Si vous possédiez déjà un compte, rendez-vous dans la gestion de vos applications et créez en une nouvelle. Nous nommerons notre nouvelle application “Octo-Passkey”. Pour le type d’application, nous choisissons Single Page Apps > Javascript.
Lorsque vous utilisez un fournisseur de service pour gérer l’authentification à vos applications, le parcours de connexion et ses différentes vues sont généralement gérés par la solution choisie. C’est le cas dans Auth0.
Auth0 gère nativement l’authentification avec les passkeys. Il est néanmoins nécessaire de configurer plusieurs paramètres afin de proposer ce mode de connexion à vos utilisateurs. Nous allons nous intéresser aux éléments suivants :
Auth0 met à votre disposition une base de données permettant de stocker les identifiants de vos utilisateurs. Nous devons la configurer afin qu’elle puisse dorénavant enregistrer les passkeys.
Sélectionner la connexion pré-existante et rendez-vous dans l’onglet Authentication Method
L’option “Passkey” est disponible. Si vous essayez de l’activer dès lors, une modale listant les pré-requis de cette méthode peut s’ouvrir selon la configuration de votre tenant Auth0.
Entrons dans la configuration en cliquant sur “Configure”. Nous sommes redirigés vers l’écran de gestion de notre politique des passkeys. Un menu déroulant nous propose un aperçu des pré-requis à leur activation ainsi que des liens vers chacun des éléments à activer / désactiver.
Une fois l’ensemble des pré-requis complétés, nous pouvons désormais activer les passkeys comme méthode d’authentification. Nous pouvons dès lors tester l’enregistrement tel que le ferait un nouvel utilisateur de notre application.
⚠️ Assurez-vous que cette connexion de base de données est bien associée à l'application que vous venez de créer dans les paramètres de connexion de l’application.
Pour nos tests, nous utiliserons l’environnement intégré d’Auth0, accessible via le bouton "Try Connection" en haut à droite de la page de paramétrage de la connexion à la base de données. Cet environnement offre une simulation fidèle de l'expérience utilisateur finale, très pratique pour valider les flux d'authentification de nos utilisateurs avant un déploiement.
Sur l'écran d'accueil, sélectionnez "Sign Up" pour enregistrer un nouvel utilisateur. Après avoir saisi une adresse email, Auth0 propose de créer une passkey. Selon votre navigateur et la compatibilité de votre machine, vous serez invité à suivre un flow de création d’une passkey.
Lorsque l’on se connecte via un appareil sur lequel une passkey n’est pas déjà physiquement enregistrée, le protocole de connexion nous invite à en créer une nouvelle pour le device en cours d’utilisation.
La possibilité de créer et d'enregistrer plusieurs passkeys pour un même compte permet une flexibilité accrue, facilitant l'accès via différents dispositifs (ordinateurs, téléphones, clés physiques, etc.). Il est généralement recommandé de créer une passkey directement sur l’appareil via lequel on souhaite accéder au service cible pour simplifier les futurs processus de connexion. Créer une seconde passkey est également un moyen efficace de retrouver son compte au cas ou l’un des deux appareils devient inaccessible (oubli, perte, casse, vol, etc…)
Cette étape reste une option et n’est pas obligatoire si vous souhaitez garder un appareil unique comme option de connexion.
L'intégration des passkeys avec Auth0 se révèle être un processus intuitif et “clés en main”. Si vous utilisez déjà leurs services sur vos applications, il vous suffira de suivre les quelques étapes de configuration décrites pour mettre à disposition ce mode d’authentification auprès de vos utilisateurs.
Nous retiendrons notamment parmi ces avantages :
Nous notons tout de même quelques points de vigilances:
Keycloak est une solution open source de gestion des identités et des accès (IAM) développée par Red Hat. Il permet de gérer l'authentification et l'autorisation des utilisateurs pour les applications web et les services. Keycloak propose les passkeys depuis la version 23, c’est-à-dire depuis novembre 2023.
Nous choisissons pour cet exemple de faire tourner Keycloak sur un container Docker en local en s’inspirant de ce tutoriel.
Nous partirons donc d’un Keycloak vierge auquel nous ajouterons une application avec authentification par passkey. Si vous souhaitez suivre le déroulé de cet article, vous pouvez utiliser cette image de Keycloak qui contient seulement un realm master par défaut.
docker run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:25.0.0 start-dev
Keycloak met en place une interface web permettant de tester la configuration de son serveur d’authentification : c’est ce que nous allons utiliser pour tester l’authentification par passkey.
Après lancement du container Docker, nous nous connectons à l’interface d’administration (sur le port 8080).
Nous commençons par créer le realm dans lequel sera enregistrée notre application :
On peut ensuite enregistrer notre application dans l’onglet Clients. Nous laissons tous les réglages par défaut mis à part les champs :
“Valid redirect URIs” désigne les URLs de redirection autorisées après s’être authentifié dans la mire d’authentification Keycloak. “Web Origins” désigne la liste des origines CORS autorisées.
Renseigner ces deux valeurs nous permettra de tester notre serveur d’authentification sur la Single Page Application hébergée par Keycloak. En production, nous aurions mis l'URL de notre SPA.
Pour permettre l’utilisation des passkeys sur notre realm Keycloak, nous devons mettre en place :
Vérifiez dans l’onglet Authentication > Required Actions que l’action “WebAuthn Register” est bien activée.
Ensuite, pour obliger les nouveaux inscrits à enregistrer une passkey, nous passons “Webauthn Register Passwordless” à “Set as default action”
Nous voulons maintenant donner la possibilité aux utilisateurs d’enregistrer une nouvelle passkey lors de leur première connexion.
On active tout d’abord l’option “User Registration” dans Realm settings > Login pour pouvoir s’inscrire à la première connexion :
Comme nous voulons faire du passwordless pur et dur, nous désactivons aussi l’obligation de spécifier un mot de passe à l’inscription (en passant “Password Validation” à “Disabled” dans le flow par défaut Registration) :
Nous allons à présent ajouter un nouveau flow d’authentification web qui utilise les passkeys. Dans Authentication > Flows, nous dupliquons le flow browser par défaut pour créer notre nouveau flow browser-passkey :
Nous adaptons le flow pour utiliser le “WebAuthn Passwordless Authenticator” :
On peut à présent désigner ce nouveau flow comme flow par défaut pour les navigateurs :
Et c'est tout pour ce qui est des réglages !
Il ne nous reste à présent plus qu’à tester. La Single-Page Application mise à disposition par Keycloak est disponible à l’adresse https://www.keycloak.org/app/ .
Il suffit d’y préciser l’url du serveur d’authentification, le nom du realm et le nom du client :
Nous arrivons ensuite sur la mire d’authentification de Keycloak. Elle devrait ressembler à ça si vous avez suivi jusqu’ici :
Comme il s’agit de notre première connexion, nous remplissons quelques informations (tout cela est configurable dans Keycloak mais nous gardons un flow à peu près standard pour ne pas s’égarer) :
Nous sommes ensuite redirigés vers la mire d’enregistrement de notre passkey :
En cliquant sur Register, en fonction de votre navigateur, vous aurez la possibilité d’enregistrer une passkey en local ou sur un autre device.
A la fin de cette étape, nous sommes finalement authentifiés et redirigés vers notre app. Ça y est, notre compte et notre passkey sont créés !
On peut maintenant essayer de se déconnecter puis se reconnecter pour tester le flow d’authentification. Votre navigateur devrait automatiquement vous suggérer la passkey que vous venez de créer. Sur Chrome, ça ressemble à ça :
Plus qu’à s’authentifier avec la méthode choisie à l’enregistrement, et voilà : nous sommes de nouveau connectés.
Nous avons donc pu nous créer un compte sur un serveur Keycloak uniquement avec une passkey ! Comme nous le verrons après, en production, il est plus prudent de permettre un flow d’authentification alternatif en cas d’oubli / de perte de l’appareil sur lequel est stocké la passkey.
L'intégration des passkeys avec Keycloak demande un peu plus de configuration que sur Auth0 mais reste relativement simple (pas de plug in particulier à installer).
Le principal point de vigilance est que les passkeys ne sont disponibles que depuis la version 23 de Keycloak. Donc si vous utilisez déjà Keycloak en production dans une version antérieure il faudra faire la migration.
Comment ça marche si je n’ai pas mon appareil avec ma passkey enregistrée sur moi?
Si vous n’avez pas d’autre moyen d’authentification, alors vous êtes bloqué! Il y a plusieurs moyens de mitiger ce risque.
Certains systèmes d’exploitation permettent de partager les passkeys entre appareils:
Il est donc nécessaire de prévoir une solution de récupération d’accès au compte ou un flow de connexion alternatif sur votre application pour éviter qu’un utilisateur soit bloqué pour cette raison.
Et si mes appareils ne supportent pas les passkeys?
Ce cas de figure devrait être de plus en plus rare à mesure que le temps passe car la spécification FIDO et les passkeys notamment sont poussées par les acteurs majeurs de la tech ( Google, Microsoft, Apple, …).
Cependant cela peut encore arriver aujourd’hui, et c’est une raison de plus pour garder un flow d’authentification plus traditionnel en plus des passkeys sur vos applications.
Comment ça s'implémente dans mon application web ou mobile ?
Tant que le serveur d’authentification est compatible avec la spécification WebAuthn, les passkeys s’implémentent de la même manière qu’un flow d’authentification OAuth + OIDC classique. La grande majorité du flow sera gérée par le serveur d’authentification. En fonction de la solution d'authentification utilisée, il y aura peut-être besoin de développer quelques fonctionnalités complémentaires propres à la gestion des passkeys (suppression des passkeys compromises par exemple).
Pour découvrir tous les flows d’authentification disponibles, nous vous invitons à vous référer à l’article Sécuriser son API
Les passkeys sont un mécanisme d’authentification puissant qui permet à la fois de sécuriser et de simplifier l’expérience utilisateur d’inscription et d’authentification dans une application.
Il n’y a pas encore de standard sur la récupération d’un compte dans le cas où la passkey n’est plus accessible. C’est un point à prendre en compte lors de leur implémentation.
Parmi les considérations d’implémentation nous noterons également :
Les passkeys deviennent la solution d’authentification de référence. Elles sont toujours plus poussées par les géants du web et sont en cours d’adoption par la plupart des solutions d’IAM comme Auth0 et Keycloak qui facilitent leur intégration dans vos applications, nouvelles ou existantes.
En tant que développeur d’applications, vous avez donc tout intérêt à les proposer à vos utilisateurs !
Merci à Arnaud Doucerain, Alain Faure, Mathieu Le Morvan, Adrien Graux, Daniel Sala et Loic Lefloch pour leur relecture attentive.