TutorielGuides

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 :

bash
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#

Graphe connexion-sms dans l'éditeur : identifiant et mot de passe, vérification du mot de passe, envoi du code par SMS, code reçu par SMS, puis succès ou échec Graphe connexion-sms dans l'éditeur : identifiant et mot de passe, vérification du mot de passe, envoi du code par SMS, code reçu par SMS, puis succès ou échec
Le graphe connexion-sms : le code est envoyé après le mot de passe, puis vérifié.
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
Envoi du code par SMSSmsOtpSendNodeTire 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 SMSSmsOtpVerifyNodeCompare 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 :

  1. Graphes d’authentification › Importer : choisissez connexion-sms.json.
  2. Ouvrez le graphe et cliquez sur Exposer ce graphe comme parcours de connexion.
  3. Importez de nouveau connexion-sms.json en 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 :

texte
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 :

bash
node faux-sns.mjs

Il é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 :

bash
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 up

AWS_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.

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.

Le mot de passe est juste : TOSIAM envoie le SMS et demande le code.

Écran Un code de vérification a été envoyé sur votre numéro de téléphone, avec six cases et le bouton Confirmer Écran Un code de vérification a été envoyé sur votre numéro de téléphone, avec six cases et le bouton Confirmer
La saisie du code : le formulaire part dès le sixième chiffre.

Ouvrez http://localhost:9125 dans un autre onglet : le faux SNS affiche le SMS reçu, avec le code en gros.

Page Faux SNS : un SMS pour +33639980012, TOSIAM : votre code de connexion est 322241. Il expire dans 300 secondes, avec le code en grand Page Faux SNS : un SMS pour +33639980012, TOSIAM : votre code de connexion est 322241. Il expire dans 300 secondes, avec le code en grand
Le SMS tel que TOSIAM l’a envoyé, reçu par le faux SNS.

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.

  1. Dans IAM, créez un utilisateur ou un rôle autorisé à envoyer des SMS :

    json
    {
      "Version": "2012-10-17",
      "Statement": [
        { "Effect": "Allow", "Action": "sns:Publish", "Resource": "*" }
      ]
    }
  2. 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 : variables AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY, fichier ~/.aws/credentials de l’utilisateur qui lance Tomcat, rôle de l’instance EC2 ou de la tâche ECS.

  3. 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 :

    bash
    export AWS_REGION=eu-west-3
    CATALINA_OPTS="$CATALINA_OPTS -Daws.sns.senderId=TOSIAM"
Faites défiler le tableau
Option JavaDéfautEffet
aws.sns.regionrégion du SDK (AWS_REGION)Région AWS utilisée pour SNS
aws.sns.profilechaîne standard du SDKProfil nommé de ~/.aws/config à utiliser
aws.sns.smsTypeTransactionalTransactional (codes, alertes : livrés en priorité) ou Promotional
aws.sns.senderIdaucunNom d’expéditeur affiché sur le téléphone (11 caractères au plus ; pas accepté dans tous les pays)

Réglages utiles#

Faites défiler le tableau
RéglageNœudEffet
ttlSeconds (300)SmsOtpSendNodeDurée de validité du code, en secondes
smsBodyTemplateSmsOtpSendNodeTexte du SMS, avec {otp} et {ttl}
phoneAttribute (telephoneNumber)SmsOtpSendNodeAttribut du profil qui contient le numéro
otpLength (6)SmsOtpSendNodeLongueur 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#

Faites défiler le tableau
SymptômeCause probable
Après le mot de passe, la page attend plusieurs secondes puis échoue (erreur 500), sans rien dans les journauxTOSIAM 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 credentialsPas 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 userL’utilisateur n’a pas de telephoneNumber (étape 1)
Un seul champ « SMS verification code » au lieu des six casesGraphe enregistré depuis l’éditeur : réimportez le JSON (étape 3)
AWS accepte l’envoi mais le SMS n’arrive pasCompte dans le bac à sable SMS et numéro non vérifié, ou numéro pas au format +33…

Pour aller plus loin#

Mis à jour le