Skip to content

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 POST dont le corps contient une propriété password à l'adresse user/confirm-password
    • Si l'appel réussit on peut ensuite activer l'authentification multi facteur en effectuant une requête POST à l'adresse user/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'adresse user/two-factor-qr-code. Ceci nous retourne une propriété svg pour afficher le code QR et une propriété url pour 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'adresse user/confirmed-two-factor-authentication.
  • À 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 (POST vers login), l'API renvoie en réponse une propriété booléene two_factor. Si la valeur est true l'utilisateur doit entrer un code d'authentification pour compléter la connexion.
  • Le code est envoyé dans un appel POST à l'adresse two-factor-challenge dans une propriété nommée code.

É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'adresse user/two-factor-recovery-codes

Pour générer des nouveaux codes:

  • Requête POST à l'adresse user/two-factor-recovery-codes

Pour se connecter avec un code

  • Envoyer une requete POST à l'adresse two-factor-challenge dans une propriété nommée recovery_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 POST dont le corps contient une propriété password à l'adresse user/confirm-password
  • Une fois confirmé on envoie une requête DELETE à l'adresse user/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.