Authentification multi facteur avec Fortify
Activer l'authentification multi facteur
- Dans le fichier de configuration de Fortify (
config/fortify.php), s'assurer que la fonctionnalité ne soit pas commentée.
<?php
// Extrait config/fortify.php
'features' => [
Features::registration(),
Features::resetPasswords(),
Features::emailVerification(),
Features::updateProfileInformation(),
Features::updatePasswords(),
// S'assurer que twoFactorAuthentication ne soit pas commenté
Features::twoFactorAuthentication([
'confirm' => true,
'confirmPassword' => true,
// 'window' => 0,
]),
],
- Vérifier les routes générées automatiquement avec
php artisan route:list. - Les routes nécessaires sont les suivantes
POST two-factor-challenge
POST user/confirm-password
GET|HEAD user/confirmed-password-status
POST user/confirmed-two-factor-authentication
POST user/two-factor-authentication
DELETE user/two-factor-authentication
GET|HEAD user/two-factor-qr-code
GET|HEAD user/two-factor-recovery-codes
POST user/two-factor-recovery-codes
Ajouter l'authentification multi facteur
Notez bien
Le scénario exposé ici est un scénario dans lequel l'authentification multi facteur est optionnelle. L'utilisateur doit donc demander d'activer cette fonctionnalité dans ce scénario.
De plus Fortify permet seulement d'activer l'authentification multi facteur à l'aide d'une application d'authentification (Google Authenticator, Microsoft Authenticator, etc.)
Pour ajouter l'authentification multi facteur, il faudra passer par les étapes suivantes:
-
L'utilisateur demande à ce qu'on active l'authentification multi facteur
- Cette action peut être exécutée seulement si l'utilisateur a fait une confirmation de mot de passe.
- L'application fait une requête
POSTdont le corps contient une propriétépasswordà l'adresseuser/confirm-password - Si l'appel réussit on peut ensuite activer l'authentification multi facteur en effectuant une requête
POSTà l'adresseuser/two-factor-authentication
-
L'utilisateur doit confirmer l'activation en envoyant un code à 6 chiffres généré par son application d'authentification (Google Authenticator, Microsoft Authenticator ou autre). On devra donc fournir un moyen pour lui d'ajouter notre application à un authentificateur.
- On doit premièrement générer le code QR pour l'utilisateur en effectuant une requête
GETà l'adresseuser/two-factor-qr-code. Ceci nous retourne une propriétésvgpour afficher le code QR et une propriétéurlpour fournir un lien pour ceux qui ne peuvent pas scannerl le QR (appareil mobile). - L'utilisateur peut alors fournir son code à 6 chiffres. On l'envoie dans un appel
POSTà l'adresseuser/confirmed-two-factor-authentication.
- On doit premièrement générer le code QR pour l'utilisateur en effectuant une requête
- À ce point-ci, si tout s'est bien passé, l'utilisateur est maintenant protégé apr l'authentification multi facteur.
- Lors d'une requête complétée pour se connecter (
POSTverslogin), l'API renvoie en réponse une propriété booléenetwo_factor. Si la valeur esttruel'utilisateur doit entrer un code d'authentification pour compléter la connexion. - Le code est envoyé dans un appel
POSTà l'adressetwo-factor-challengedans une propriété nomméecode.
Étapes supplémentaires
Lors de l'activation de l'authentification multi facteur, il faut également générer les codes de récupération de l'utilisateur dans le cas où il lui serait impossible de fournir un code d'authentification.
Pour récupérer les codes:
- Requête
GETà l'adresseuser/two-factor-recovery-codes
Pour générer des nouveaux codes:
- Requête
POSTà l'adresseuser/two-factor-recovery-codes
Pour se connecter avec un code
- Envoyer une requete
POSTà l'adressetwo-factor-challengedans une propriété nomméerecovery_code.- N.B. Une fois un code utilisé pour s'authentifier, il faudra générer une nouvelle série de codes et les donner à l'utilisateur, car la série actuelle sera invalidée.
Pour désactiver l'authentification multi facteur:
- L'utilisateur confirme son mot de passe
- requête
POSTdont le corps contient une propriétépasswordà l'adresseuser/confirm-password - Une fois confirmé on envoie une requête
DELETEà l'adresseuser/two-factor-authentication
Visualisation
Activation 2FA
sequenceDiagram
autonumber
Utilisateur->>Système: Confirmation du mot de passe
Note right of Utilisateur: Requête POST à user/confirm-password <br/>avec propriété password
Utilisateur->>Système: Demande d'activer 2FA
Note right of Utilisateur: Requête POST à two-factor-authentication
Système->>Utilisateur: Affiche le code QR pour authentificateur
Note left of Système: Retourne le code d'un SVG <br/>et l'URL otpauth dans la réponse
Note left of Utilisateur: Scanne le code QR dans une <br/>application d'authentification
Utilisateur->>Système: Envoie une requête POST à <br/>user/confirmed-two-factor-authentication <br/>avec le code à 6 chiffres dans la propriété "code"
Système->>Utilisateur: Retourne une réponse 200 OK indiquant <br/>la fin du processus.
Connexion avec 2FA
sequenceDiagram
autonumber
participant U as Utilisateur
participant S as Système
U->>S: Demande de connexion
Note right of U: Requête POST à login avec <br/>propriétés username et password
S->>U: Renvoie la page avec le "challenge" 2FA
alt avec code
Note left of U: Récupère le code d'authentification <br/>de son application.
U->>S: Envoie le code à 6 chiffres
Note right of U: Requête POST à two-factor-challenge <br/>avec le code dans une propriété nommée code
else avec code de récupération
Note left of U: Récupère un code de récupération
U->>S: Envoie le code de récupération
Note right of U: Requête POST à two-factor-challenge <br/>avec le code dans une propriété nommée recovery_code
end
S->>U: Retourne une réponse 200 OK indiquant <br/>la fin du processus.