TutorielGuides

Double authentification TOTP

Sur cette page

Ce tutoriel ajoute un second facteur à la connexion : après son mot de passe, l’utilisateur saisit le code à six chiffres affiché par une application d’authentification (Google Authenticator, Microsoft Authenticator, FreeOTP, Aegis…). Ces codes TOTP (RFC 6238) sont calculés à partir d’un secret partagé et de l’heure ; ils changent toutes les 30 secondes.

Un seul graphe d’authentification gère les deux cas :

  • première connexion : l’utilisateur n’a pas encore de secret. TOSIAM en génère un, l’affiche sous forme de QR code, vérifie un premier code, enregistre le secret et donne dix codes de récupération ;
  • connexions suivantes : TOSIAM demande le code TOTP. Après trois codes faux, il propose un code de récupération.

Étape 1 : le graphe#

Graphe connexion-totp dans l'éditeur : identifiant et mot de passe, vérification, déjà enrôlé ?, puis soit code TOTP et code de récupération, soit génération du secret, QR code, code de confirmation, enregistrement et codes de récupération Graphe connexion-totp dans l'éditeur : identifiant et mot de passe, vérification, déjà enrôlé ?, puis soit code TOTP et code de récupération, soit génération du secret, QR code, code de confirmation, enregistrement et codes de récupération
Le graphe connexion-totp : la branche du haut enrôle l’utilisateur, celle du bas vérifie son code.
Faites défiler le tableau
ÉtapeNœudRôle
Identifiant et mot de passePageNode (UsernameCollectorNode + PasswordCollectorNode)Un seul écran pour les deux champs
Vérification du mot de passeDataStoreNodeContrôle dans l’annuaire du royaume
Déjà enrôlé ?MfaEnrollmentCheckNode (methodsToCheck : totp)enrolled si l’utilisateur a déjà un secret TOTP, sinon notEnrolled
Génération du secretTotpSecretGeneratorNode (issuer : TOSIAM)Tire un secret et construit l’URI otpauth://
QR codeTotpQrCodeDisplayNodeAffiche l’URI sous forme de QR code
Code de confirmationTotpVerifierNode (secretSource : sharedState)Vérifie un premier code avec le secret pas encore enregistré
Enregistrement du secretTotpEnrollCommitNodeEnregistre le secret dans le profil de l’utilisateur et génère les codes de récupération
Codes de récupérationTotpRecoveryCodesDisplayNodeLes affiche une seule fois
Code TOTPTotpVerifierNodeVérifie le code avec le secret enregistré ; exceeded après trois échecs
Code de récupérationRecoveryCodeVerifyNodeAccepte un code de récupération, une seule fois chacun

Chaque nœud est décrit dans Nœuds : MFA TOTP.

Le graphe complet est disponible en JSON : connexion-totp.json.

Étape 2 : importer et exposer le graphe#

Dans le royaume ref :

  1. Graphes d’authentification › Importer : choisissez connexion-totp.json.
  2. Ouvrez le graphe et cliquez sur Exposer ce graphe comme parcours de connexion : la console crée l’instance de module graph-module qui rend le graphe accessible à la connexion.
  3. Importez de nouveau connexion-totp.json en choisissant Remplacer.

Le parcours est maintenant accessible à l’adresse :

texte
http://localhost:8080/tosiam/auth/?realm=ref&module=connexion-totp

Étape 3 : la première connexion#

Ouvrez l’adresse ci-dessus et connectez-vous.

Page de connexion TOSIAM : nom d'utilisateur et mot de passe sur le même écran Page de connexion TOSIAM : nom d'utilisateur et mot de passe sur le même écran
Identifiant et mot de passe, sur un seul écran.

L’utilisateur n’a pas encore de secret : TOSIAM affiche un QR code. Scannez-le avec l’application d’authentification, qui ajoute un compte « TOSIAM: identifiant », puis cliquez sur Confirmer.

Écran Scannez ce QR code avec votre application d'authentification, avec le QR code et le bouton Confirmer Écran Scannez ce QR code avec votre application d'authentification, avec le QR code et le bouton Confirmer
Le QR code contient l’URI otpauth://totp/TOSIAM:… avec le secret.

Saisissez le code affiché par l’application. Les six cases se remplissent chiffre par chiffre ; le formulaire part dès la sixième.

Écran Saisissez le code affiché dans votre application d'authentification, six cases Écran Saisissez le code affiché dans votre application d'authentification, six cases
Le premier code prouve que l’application a bien enregistré le secret.

Le code est juste : TOSIAM enregistre le secret et affiche dix codes de récupération. C’est la seule fois où ils sont visibles ; l’utilisateur doit les conserver (bouton Copier tous les codes).

Écran Conservez ces codes de récupération dans un endroit sûr, avec dix codes, boutons Copier tous les codes et Confirmer Écran Conservez ces codes de récupération dans un endroit sûr, avec dix codes, boutons Copier tous les codes et Confirmer
Les codes de récupération, à usage unique.

Confirmer termine la connexion.

Étape 4 : les connexions suivantes#

À la connexion suivante, après le mot de passe, TOSIAM demande directement le code de l’application.

Écran de saisie du code TOTP, six cases Écran de saisie du code TOTP, six cases
Un utilisateur enrôlé saisit le code de son application.

Un code faux ramène au même écran (sans message d’erreur dans la version actuelle). Au troisième échec, TOSIAM propose un code de récupération :

Écran Code de récupération avec un champ et le bouton Se connecter Écran Code de récupération avec un champ et le bouton Se connecter
Après trois codes faux, un code de récupération permet de se connecter.

Chaque code de récupération ne sert qu’une fois ; un code déjà utilisé fait échouer la connexion.

Réglages utiles#

Faites défiler le tableau
RéglageNœudEffet
retryLimit (3)TotpVerifierNodeNombre de codes faux avant la sortie exceeded
stepsInWindow (1)TotpVerifierNodeTolérance de décalage d’horloge, en pas de 30 secondes de part et d’autre
digits (6), period (30), algorithm (HmacSHA1)TotpSecretGeneratorNode et TotpVerifierNodeDoivent être identiques dans les deux nœuds ; certaines applications ignorent les valeurs autres que celles par défaut
issuerTotpSecretGeneratorNodeNom affiché par l’application devant l’identifiant

Remettre à zéro un utilisateur#

Un utilisateur qui a perdu son téléphone et ses codes de récupération ne peut plus se connecter. Le secret et les codes sont enregistrés dans l’attribut oathDeviceProfiles de son profil : vider cet attribut le ramène à l’enrôlement à sa prochaine connexion.

bash
curl -X PUT "http://localhost:8080/tosiam/json/ref/users/<identifiant>" \
     -H "Content-Type: application/json" \
     -H "X-Requested-With: XMLHttpRequest" \
     -H "Accept-API-Version: resource=3.0, protocol=1.0" \
     -H "iPlanetDirectoryPro: <jeton administrateur>" \
     -d '{"oathDeviceProfiles": []}'

En cas de problème#

Faites défiler le tableau
SymptômeCause probable
Après le mot de passe, page vide avec un seul bouton Se connecterGraphe enregistré depuis l’éditeur : stage vaut l’identifiant du nœud. Réimportez le JSON (étape 2)
Le code est toujours refuséHorloge du téléphone ou du serveur décalée de plus de 30 secondes, ou digits / period / algorithm différents entre la génération et la vérification
Le QR code ne se scanne pasL’écran n’affiche pas le secret en texte ; agrandissez la page ou utilisez une autre application
L’utilisateur est renvoyé sur l’enrôlement à chaque connexionMfaEnrollmentCheckNode ne trouve pas de profil TOTP : vérifiez methodsToCheck (totp) et que TotpEnrollCommitNode est bien sur le chemin de l’enrôlement

Pour aller plus loin#

Mis à jour le