Automatiser les tests MFA par SMS avec Playwright : Tutoriel complet et pratique

Nous avons vu grâce à notre série d’articles (Article 1, Article 2, Article 3) le contexte dans lequel le MFA évolue, ce que cela implique pour les équipes QA, et comment nous pouvons mettre en place des mécanismes pertinents pour maintenir une couverture de tests satisfaisante sans pour autant compromettre la sécurité ou nous éloigner du comportement de production.

Introduction

Ce mini-tuto vise à mettre les mains dans le cambouis en automatisant un test E2E (End-To-End) typique : le login sécurisé par MFA via SMS. Ceci s’applique évidemment à d’autres flux clés comme les validations de paiement ou de transactions critiques.

Pour ce faire, nous allons :

  • Installer et mettre en place un outil de tests End-To-End. Dans ce cas nous allons utiliser Playwright, mais tout outil d’automatisation conviendrait.
  • Utiliser un service tiers nous permettant d’avoir accès à un numéro de téléphone virtuel pour la réception de SMS (ceci s’applique aussi pour des emails). Pour cela nous allons utiliser le service GetMyMFA, mais d’autres services existent aussi comme décrits dans les précédents articles.
  • Nous connecter vers une landing page de démonstration disponible pour ce type de tests : https://demo.mymfa.io.

Si vous souhaitez creuser plus dans le détail les bases théoriques sur lesquelles nous allons nous appuyer, n’hésitez pas à vous référer aux articles précédents cités en début d’article.

Le macro-processus que nous allons implémenter est le suivant :

Diagramme illustrant un processus de login automatisé avec des flux MFA
  1. Lancement de la connexion : Le framework d’automatisation initie une tentative de connexion à l’application de démo.
  1. Envoi du SMS par l’application : L’application envoie un code MFA par SMS à un numéro de téléphone virtuel GetMyMFA.
  1. Mise à disposition du SMS via l’API : Le SMS contenant le code MFA est rendu accessible par l’API de GetMyMFA.
  1. Récupération du code MFA via API : Le framework d’automatisation appelle l’API de GetMyMFA pour récupérer le message SMS contenant le code MFA.
  1. Soumission du code MFA : Le code récupéré est ensuite injecté dans le formulaire de connexion pour finaliser l’authentification.Veuillez noter que l’étape 2 (envoi du SMS) ne sera pas réalisée dans cette démo (car cela aurait un coût). Cependant, nous pourrons dérouler le processus de manière automatique sans avoir à faire trop de compromis.

Tutoriel

Étape 1 : Setup de notre projet Playwright (en typescript)

Si vous n’avez jamais utilisé Playwright et/ou fait des développements en TypeScript, pensez à installer NPM sur votre machine.

  • Initialisation du projet :
npm init playwright@latest
  • Choisir TypeScript comme langage et suivez les instructions en confirmant que les tests vont dans le dossier tests, pas d’installation GitHub Actions, et confirmez l’installation des navigateurs Playwright comme ceci :
  • Vous aurez un projet initialisé comme ceci :

Étape 2 : Création d’un compte de test GetMyMFA et récupération de notre clé API

Naviguez vers https://get.mymfa.io puis choisissez le bouton « Sign Up ». Répondez au questionnaire et activez votre compte utilisateur.Un bouton « Trial » vous permettra d’obtenir un numéro de téléphone virtuel temporaire ainsi que bénéficier de la fonctionnalité d’APIs. Une fois votre numéro de test obtenu, vous devriez avoir accès au menu « API Configuration » avec une vue similaire à celle-ci :

Capture de l'interface de GetMyMFA

Créez votre clé d’API et gardez-là bien au chaud (car une fois créée elle ne peut plus être consultée !).

Étape 3 : Récupération de l’identifiant de votre numéro de téléphone virtuel

Maintenant que nous avons notre clé d’API, nous allons devoir récupérer l’ID technique de notre numéro de téléphone virtuel. Pour cela, nous allons utiliser notre clé d’API et faire les calls à l’API de GetMyMFA :

  • Ouvrez l’outil vous permettant de faire des calls APIs de votre choix. Dans ce cas nous allons utiliser Postman (mais tout autre outil peut convenir).
  • Pensez à saisir votre clé d’API dans vos Headers dans la balise x-api-key.
  • Faites un premier call pour lister vos numéros de téléphone à l’adresse https://programmatic-api.client.get.mymfa.io/v1/phone-numbers. Vous devriez avoir un résultat similaire à celui-ci :
Capture de Postman faisant un call API pour lister les numéros de téléphone attachés à un compte
Call /phone-numbers permettant de lister les numéros attachés à un compte

Vous trouverez l’ID technique de votre numéro dans la balise « phoneId ».

Si vous souhaitez voir comment vous allez récupérer le MFA sur ce numéro de téléphone, faites un call GET sur https://programmatic-api.client.get.mymfa.io/v1/<votre_id_de_telephone>/mfa/latest. Le code se trouve dans l’attribut « mfaCode » (n’oubliez pas de saisir votre x-api-key !) :

Capture de Postman faisant un call API pour accéder à un code MFA reçu par SMS
Call /mfa/latest permettant d’obtenir le dernier code MFA reçu sur un numéro donné.

Étape 4 : Création de notre fonction permettant de récupérer notre code MFA

Maintenant que nous connaissons l’ID technique de notre numéro de téléphone, nous sommes en mesure de le récupérer via API. Nous devons coder la fonction nous permettant de récupérer le dernier MFA pour le numéro de téléphone donnée. En TypeScript, cela ressemblerait à ça :

export async function getMfaCode(phoneId: string, apiKey: string){
  try {
    const headers = {
      'x-api-key': apiKey,
      'Content-Type': 'application/json'
    };
    const response = await fetch(`${GETMYMFA_BASE_URL}/${phoneId}/mfa/latest`, { headers });
    const data = await response.json();
    const mfaCode = data.mfaCode;
    return mfaCode;
  } catch (error) {
    console.error('MFA retrieval error');
    console.error(error);
  }
}

Étape 5 : On fait des tests propres, on sécurise

Étant des testeurs aguerris sur les bonnes pratiques cyber, nous allons évidemment utiliser un fichier .env qui restera secret pour stocker nos informations sensibles comme le l’ID de notre numéro de téléphone, notre clé API, ainsi que nos identifiants de connexion :

import { test, expect } from '@playwright/test';
import * as dotenv from 'dotenv';
dotenv.config();

const PHONE_NUMBER_ID = process.env.GETMYMFA_PHONE_NUMBER_ID!;
const API_KEY = process.env.GETMYMFA_API_KEY!;
const TEST_USER_EMAIL = process.env.TEST_USER_EMAIL!
const TEST_USER_PASSWORD = process.env.TEST_USER_PASSWORD!

const GETMYMFA_DEMO_URL = 'https://demo.mymfa.io/login'
const GETMYMFA_BASE_URL = 'https://programmatic-api.client.get.mymfa.io/v1'

Étape 6 : On mixe le tout, et voilà !

Il n’y a « plus qu’à » mettre toutes les pièces ensemble au sein d’un test accédant à la page de login puis insérant le code MFA récupéré via API :

test('E2E Login with SMS-based MFA', async ({ page }) => {
  // Navigate to the demo page and confirm title
  await page.goto(GETMYMFA_DEMO_URL);
  await expect(page).toHaveTitle(/GetMyMFA/);

  // Fill in the login fields and launch login
  await page.getByRole('textbox', { name: 'Email' }).fill(TEST_USER_EMAIL);
  await page.getByRole('textbox', { name: 'Password' }).fill(TEST_USER_PASSWORD);
  await page.getByRole('button', { name: 'Login', exact: true }).click();

  // Confirm popup appeared to request MFA
  await expect(page.getByText('MFA Time')).toBeVisible();

  // Get MFA code from GetMyMFA API
  const mfaCode = await getMfaCode(PHONE_NUMBER_ID, API_KEY)
  
  // Inject MFA code in the input field and submit
  await page.getByRole('textbox', { name: 'MFA Code' }).fill(mfaCode);
  await page.getByRole('button', { name: 'Submit' }).click();
  
  // Confirm the process was successful
  await expect(page.getByText('MFA code verified')).toBeVisible();
});

Et voilà ! Il n’y a plus qu’à lancer la commande suivante et nos tests devraient s’exécuter :

npx playwright test 

PS : Dans cet exemple de nombreuses choses pourraient s’améliorer comme par exemple l’accès aux éléments via des IDs uniques ou les mécanismes de contrôle et de validation.

Le code source du test est disponible sur ce repo GitHub Open-Source. N’hésitez pas à contribuer si vous le souhaitez !

Conclusion et récapitulatif

L’intégration du MFA dans les parcours utilisateurs critiques est aujourd’hui incontournable, mais elle ne doit pas devenir un frein à l’automatisation des tests. Grâce à des outils comme Playwright et des services comme GetMyMFA, MailSlurp ou autres, il est tout à fait possible de concilier sécurité et testabilité.

Ce tutoriel vous a montré comment automatiser un flux complet de connexion avec authentification à double facteur, de manière fiable et reproductible pour couvrir des tests autrefois considérés comme “non automatisables”.

Ce type de setup peut facilement être adapté à d’autres contextes sensibles comme la validation de paiements, la confirmation de transactions, ou l’accès à des fonctionnalités critiques en entreprise.

En résumé : le MFA ne doit plus être un obstacle à l’automatisation, mais un composant intégré à votre stratégie de test End-to-End.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Agilité

Passer du kanban à un « Scrumban »

Cet article est la « suite » de l’article de l’année dernière sur le passage du Scrum au Kanban. Le projet continuant de vivre et l’équipe continuant à faire de l’amélioration continue (on ne peut pas être agile sans amélioration continue !), nous avons encore évolué ! Comme dit dans l’article précédent nous avons

Lire la suite »
Agilité

Résultats sondage 2022: Quel testeur Agile êtes-vous ?

Avant toute analyse je souhaiterais remercier les 118 personnes qui ont répondues à ce sondage et qui permettent d’avoir une représentation plutôt fiable sur la vision du testeur agile mais aussi l’évolution depuis le sondage précédent en 2019. On voit d’ailleurs qu’à part pour le BDD et l’ATDD qui progressent

Lire la suite »
Agilité

Le shift right – L’adaptation du test au déploiement continu ?

Avant de parler du shift right il faut d’abord connaitre le shift left et identifier ses limites dans le contexte actuel et plus particulièrement dans l’optique du déploiement continu. La limite du shift left : On parle beaucoup du shift left. J’en ai d’ailleurs fait le sujet d’un de mes articles.

Lire la suite »