Double authentification par SMS
Sur cette page
Ce tutoriel ajoute un second facteur à la connexion : après son mot de passe, l’utilisateur reçoit un code à six chiffres par SMS et le saisit. Le code est tiré au hasard à chaque connexion et expire au bout de cinq minutes.
TOSIAM envoie les SMS par AWS SNS (Simple Notification Service). Pour suivre le tutoriel sans compte AWS ni téléphone, un faux service SNS, un petit serveur Node.js, reçoit les SMS et les affiche dans le navigateur.
Étape 1 : le numéro de téléphone#
TOSIAM lit le numéro dans l’attribut telephoneNumber du profil. Il doit être au format international E.164 : +33 suivi du numéro sans le premier zéro. Pour l’utilisateur dduck, avec un numéro de la plage réservée aux œuvres de fiction :
curl -X PUT "http://localhost:8080/tosiam/json/ref/users/dduck" \
-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 '{"telephoneNumber": ["+33639980012"]}'Étape 2 : 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 |
| Envoi du code par SMS | SmsOtpSendNode | Tire un code, le garde dans l’état partagé du parcours et l’envoie au numéro de l’utilisateur ; error si l’utilisateur n’a pas de numéro ou si l’envoi échoue |
| Code reçu par SMS | SmsOtpVerifyNode | Compare le code saisi : true s’il est juste, false s’il est faux, expired s’il a expiré |
Le texte du SMS est réglé dans smsBodyTemplate : {otp} est remplacé par le code et {ttl} par sa durée de validité en secondes. Restez sous 160 caractères pour tenir en un seul SMS.
Le graphe complet est disponible en JSON : connexion-sms.json. Chaque nœud est décrit dans Nœuds : OTP SMS / Email.
Étape 3 : importer et exposer le graphe#
Dans le royaume ref :
- Graphes d’authentification › Importer : choisissez
connexion-sms.json. - Ouvrez le graphe et cliquez sur Exposer ce graphe comme parcours de connexion.
- Importez de nouveau
connexion-sms.jsonen choisissant Remplacer.
La troisième étape rétablit le champ stage de chaque nœud, que l’éditeur remplace par l’identifiant du nœud. Sans elle, la page de connexion n’utilise pas son écran dédié : au lieu des six cases, elle affiche un simple champ « SMS verification code ». L’explication complète est dans le tutoriel Double authentification TOTP.
Le parcours est accessible à l’adresse :
http://localhost:8080/tosiam/auth/?realm=ref&module=connexion-smsÉtape 4 : brancher TOSIAM sur le faux SNS#
Téléchargez faux-sns.mjs et lancez-le :
node faux-sns.mjsIl écoute sur http://localhost:9125 et répond à l’appel Publish de l’API SNS comme le ferait AWS.
TOSIAM utilise le SDK AWS, qui lit sa configuration dans des variables d’environnement. Arrêtez TOSIAM, puis redémarrez-le depuis un terminal où ces variables sont définies :
export AWS_REGION=eu-west-3
export AWS_ACCESS_KEY_ID=faux
export AWS_SECRET_ACCESS_KEY=faux
export AWS_ENDPOINT_URL_SNS=http://localhost:9125
$TOSIAM_HOME/bin/tosiam.sh down
$TOSIAM_HOME/bin/tosiam.sh upAWS_ENDPOINT_URL_SNS redirige les appels SNS vers le faux service ; la région et les clés sont obligatoires pour le SDK, mais le faux SNS ne les vérifie pas.
Étape 5 : se connecter#
Ouvrez l’adresse du parcours et connectez-vous.
Le mot de passe est juste : TOSIAM envoie le SMS et demande le code.
Ouvrez http://localhost:9125 dans un autre onglet : le faux SNS affiche le SMS reçu, avec le code en gros.
Saisissez le code : la connexion aboutit. Un code faux, ou un code saisi après cinq minutes, mène à la page Échec de la connexion à TOSIAM.
En production : AWS SNS#
Avec un vrai compte AWS, seules les variables d’environnement changent.
-
Dans IAM, créez un utilisateur ou un rôle autorisé à envoyer des SMS :
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sns:Publish", "Resource": "*" } ] } -
Donnez à TOSIAM la région et les droits de ce compte, sans
AWS_ENDPOINT_URL_SNS. Le SDK cherche les droits dans l’ordre habituel d’AWS : variablesAWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY, fichier~/.aws/credentialsde l’utilisateur qui lance Tomcat, rôle de l’instance EC2 ou de la tâche ECS. -
Pour que ces réglages survivent aux redémarrages, placez-les dans
apache-tomcat-11.0.14/bin/setenv.sh, que Tomcat lit à chaque démarrage. Les options propres à TOSIAM s’y ajoutent àCATALINA_OPTS:export AWS_REGION=eu-west-3 CATALINA_OPTS="$CATALINA_OPTS -Daws.sns.senderId=TOSIAM"
| Option Java | Défaut | Effet |
|---|---|---|
aws.sns.region | région du SDK (AWS_REGION) | Région AWS utilisée pour SNS |
aws.sns.profile | chaîne standard du SDK | Profil nommé de ~/.aws/config à utiliser |
aws.sns.smsType | Transactional | Transactional (codes, alertes : livrés en priorité) ou Promotional |
aws.sns.senderId | aucun | Nom d’expéditeur affiché sur le téléphone (11 caractères au plus ; pas accepté dans tous les pays) |
Réglages utiles#
| Réglage | Nœud | Effet |
|---|---|---|
ttlSeconds (300) | SmsOtpSendNode | Durée de validité du code, en secondes |
smsBodyTemplate | SmsOtpSendNode | Texte du SMS, avec {otp} et {ttl} |
phoneAttribute (telephoneNumber) | SmsOtpSendNode | Attribut du profil qui contient le numéro |
otpLength (6) | SmsOtpSendNode | Longueur du code. Gardez 6 : la page de connexion affiche toujours six cases, un code plus long ne peut pas être saisi |
Pour demander le numéro pendant la connexion plutôt que le lire dans le profil, placez un PhoneCollectorNode avant l’envoi : il range le numéro saisi dans l’état partagé, où SmsOtpSendNode le cherche en premier.
En cas de problème#
| Symptôme | Cause probable |
|---|---|
| Après le mot de passe, la page attend plusieurs secondes puis échoue (erreur 500), sans rien dans les journaux | TOSIAM ne connaît pas la région AWS : définissez AWS_REGION (ou -Daws.sns.region) et redémarrez |
Après le mot de passe, Échec de la connexion ; catalina.out contient Failed to send OTP SMS et Unable to load credentials | Pas de droits AWS : variables AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY, profil ou rôle |
Après le mot de passe, Échec de la connexion ; catalina.out contient Cannot resolve phone for user | L’utilisateur n’a pas de telephoneNumber (étape 1) |
| Un seul champ « SMS verification code » au lieu des six cases | Graphe enregistré depuis l’éditeur : réimportez le JSON (étape 3) |
| AWS accepte l’envoi mais le SMS n’arrive pas | Compte dans le bac à sable SMS et numéro non vérifié, ou numéro pas au format +33… |
Pour aller plus loin#
- Double authentification TOTP : un second facteur sans coût d’envoi, avec une application d’authentification.
- Nœuds : OTP SMS / Email : les nœuds d’envoi par SMS et par e-mail.
- Un module de vérification SMS (legacy) : la même fonction avec l’ancien mécanisme de chaînes d’authentification.
Mis à jour le