Skip to content

Authentification avec Fortify et Sanctum

Sanctum

Laravel Sanctum nous offre une façon d'authentifier une application auprès d'une API utilisant Laravel. Pour authentifier une application à page unique (Single Page Application), Sanctum utilise l'authentification basée sur le cookie de session Laravel.

L'installation de Sanctum se fait en exécutant

php artisan install:api

Configuration de base

  • Dans le fichier .env assurez-vous d'avoir les configurations suivantes (exemple avec les valeurs par défaut d'Angular)
FRONTEND_URL=http://localhost:4200
SANCTUM_STATEFUL_DOMAINS=localhost:4200
SESSION_DOMAIN=localhost
  • Dans le fichier bootstrap/app.php on devra ajouter
<?php

->withMiddleware(function (Middleware $middleware): void {
        $middleware->statefulApi();        
    })
  • Assurez vous de bien avoir configuré le fichier configuration/cors.php pour permettre la transmission correcte des cookies.

php artisan config:publish cors

  • supports_credentials doit être true
  • allowed_origins doit correspondre à la liste des adresses desquelles les requêtes HTTP proviendront.

  • Pour protéger des routes derrière l'authentification de Sanctum, il suffit de leur appliquer l'intergiciel auth.sanctum

Par exemple, dans le fichier routes/api.php, une route a été créée pour afficher les détails de l'utilisateur connecté. Cette dernière utilise l'intergiciel de Sanctum.

<?php

Route::get('/user', function (Request $request) {
    return $request->user();
})->middleware('auth:sanctum');

Protection CSRF

Toutes les requêtes protégées par Sanctum (incluant les routes d'authentification - voir Fortify) sont également protégées avec un jeton CSRF. Ce jeton sera envoyé dans un cookie et devra être envoyé avec toutes les requêtes HTTP dans une en-tête nommée X-XSRF-COOKIE.

  • Récupérer le jeton en faisant une requête HTTP GET à /sanctum/csrf-cookie
  • Ceci renvoie le cookie nommé XSRF-TOKEN
  • Ajouter le contenu de ce cookie aux autres requêtes HTTP via l'en-tête X-XSRF-COOKIE.

Notez bien

Si vous obtenez une erreur 419, c'est que Laravel attend un jeton CSRF (ex. routes web)

Fortify

Laravel Fortify est une implémentation de l'authentification de Laravel qui ne dépend pas du client utilisé. C'est à dire qu'on peut l'utiliser tant pour une application Laravel avec des pages Blade qu'avec un application de type page unique (Angular, React, etc.).

Fortify va créer pour nous les routes et contrôleurs requis pour tous les besoins d'authentification (inscription, réinitialisation de mot de passe, confirmation de courriel, authentification multifacteur).

Installation et configuration initiale

  • Installer Fortify via Composer

    • composer require laravel/fortify
  • Publier les ressources de Fortify

    • php artisan fortify:install
  • Des migrations seront crées durant l'installation

    • php artisan migrate

Un fichier config/fortify.php est créé durant l'installation. On s'attardera à trois (3) sections de ce fichier.

  • 'home' => Définir la route "home" de votre application client.
  • 'views' => false Définir ce paramètre à false pour ne pas utiliser les vues fournies par Fortify.
  • 'features' => [] Une liste des différentes fonctionnalités implémentées par Fortify. On peut les activer et désactiver à notre guise ou pour nous permettre de les implémenter une à la fois.

Authentification

La documentation officielle de Fortify vous donne tous les détails pour implémenter les différentes fonctionnalités d'authentification.

Voici un résumé rapide pour la création d'utilisateur.

  • Lister les routes avec php artisan route:list
  • On remarque qu'il y a la route register qui répond à une requête HTTP POST
  • Tiré de la documentation de Fortify, on verra que pour créer un utilisateur, on utilisera cette route. La route register s'attend à recevoir en paramètre
    • name (string)
    • email (string)
    • password (string)
    • password_confirmation (string)
  • Si l'enregistrement réussit, on recevra une réponse avec le code 201
  • Si l'enregistrement échoue, on recevra une réponse avec le code 422

C'est à nous de gérer la suite des choses lors de la réception de la réponse.

Rappel

Toutes les routes de l'authentification de Fortify sont protégées par l'intergiciel auth:sanctum. Il faut donc s'assurer de transmettre le jeton CSRf via l'en-tête X-XSRF-TOKEN.

Références

Laravel Sanctum

Laravel Fortify