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#
| Étape | Nœud | Rôle |
|---|---|---|
| Identifiant et mot de passe | PageNode (UsernameCollectorNode + PasswordCollectorNode) | Un seul écran pour les deux champs |
| Vérification du mot de passe | DataStoreNode | Contrô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 secret | TotpSecretGeneratorNode (issuer : TOSIAM) | Tire un secret et construit l’URI otpauth:// |
| QR code | TotpQrCodeDisplayNode | Affiche l’URI sous forme de QR code |
| Code de confirmation | TotpVerifierNode (secretSource : sharedState) | Vérifie un premier code avec le secret pas encore enregistré |
| Enregistrement du secret | TotpEnrollCommitNode | Enregistre le secret dans le profil de l’utilisateur et génère les codes de récupération |
| Codes de récupération | TotpRecoveryCodesDisplayNode | Les affiche une seule fois |
| Code TOTP | TotpVerifierNode | Vérifie le code avec le secret enregistré ; exceeded après trois échecs |
| Code de récupération | RecoveryCodeVerifyNode | Accepte 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 :
- Graphes d’authentification › Importer : choisissez
connexion-totp.json. - Ouvrez le graphe et cliquez sur Exposer ce graphe comme parcours de connexion : la console crée l’instance de module
graph-modulequi rend le graphe accessible à la connexion. - Importez de nouveau
connexion-totp.jsonen choisissant Remplacer.
Le parcours est maintenant accessible à l’adresse :
http://localhost:8080/tosiam/auth/?realm=ref&module=connexion-totpÉtape 3 : la première connexion#
Ouvrez l’adresse ci-dessus et connectez-vous.
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.
Saisissez le code affiché par l’application. Les six cases se remplissent chiffre par chiffre ; le formulaire part dès la sixième.
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).
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.
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 :
Chaque code de récupération ne sert qu’une fois ; un code déjà utilisé fait échouer la connexion.
Réglages utiles#
| Réglage | Nœud | Effet |
|---|---|---|
retryLimit (3) | TotpVerifierNode | Nombre de codes faux avant la sortie exceeded |
stepsInWindow (1) | TotpVerifierNode | Tolérance de décalage d’horloge, en pas de 30 secondes de part et d’autre |
digits (6), period (30), algorithm (HmacSHA1) | TotpSecretGeneratorNode et TotpVerifierNode | Doivent être identiques dans les deux nœuds ; certaines applications ignorent les valeurs autres que celles par défaut |
issuer | TotpSecretGeneratorNode | Nom 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.
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#
| Symptôme | Cause probable |
|---|---|
| Après le mot de passe, page vide avec un seul bouton Se connecter | Graphe 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 pas | L’é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 connexion | MfaEnrollmentCheckNode 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#
- Nœuds : MFA TOTP : tous les réglages des nœuds, dont le choix entre plusieurs méthodes (
MfaChoiceNode) et la politique MFA (MfaPolicyDecisionNode). - Import, export et format JSON : format du fichier importé.
- Callbacks et génération de formulaire : comment la page de connexion construit chaque écran.
- Double authentification par SMS : le même principe avec un code envoyé par SMS.
Mis à jour le