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 :

- Lancement de la connexion : Le framework d’automatisation initie une tentative de connexion à l’application de démo.
- Envoi du SMS par l’application : L’application envoie un code MFA par SMS à un numéro de téléphone virtuel GetMyMFA.
- Mise à disposition du SMS via l’API : Le SMS contenant le code MFA est rendu accessible par l’API de GetMyMFA.
- 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.
- 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 :

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 :

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 !) :

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


