Dès qu'on commence à séparer son Frontend (React, Vue, Angular) de son Backend Symfony, la gestion de l'authentification change. On oublie les cookies de session classiques pour passer au Stateless. Et l'outil roi pour ça, c'est le JWT.
Dans ce tutoriel, on va configurer ensemble le bundle LexikJWTAuthenticationBundle pour qu'il travaille main dans la main avec API Platform.
1. Installation des dépendances
On commence par installer le nécessaire. On va avoir besoin du bundle de sécurité de base, d'API Platform et du bundle de gestion des tokens.
composer require api lexik/jwt-authentication-bundle
2. La cryptographie : Générer les clés
Le JWT fonctionne avec un système de clés asymétriques. Une clé privée signe le jeton, une clé publique le vérifie. Symfony simplifie cela avec une commande dédiée :
php bin/console lexik:jwt:generate-keypair
Astuce : Assurez-vous que le dossier config/jwt est bien créé et que les clés ne sont pas versionnées si vous êtes sur un serveur de prod !
3. L'Entité User et l'interface Security
Pour s'authentifier, il nous faut un utilisateur. Si vous n'en avez pas, utilisez le maker :
php bin/console make:user
Dans votre entité User.php, assurez-vous d'ajouter l'attribut #[ApiResource]. Pour des raisons de sécurité, je vous conseille de désactiver les opérations d'écriture publiques sur cette ressource.
4. Le cerveau : Configuration de security.yaml
C'est l'étape où beaucoup de développeurs se perdent. On va diviser notre pare-feu en deux : un pour le login (obtenir le token) et un pour l'API (vérifier le token).
# config/packages/security.yaml
firewalls:
login:
pattern: ^/api/login
stateless: true
json_login:
check_path: /api/login_check
success_handler: lexik_jwt_authentication.handler.authentication_success
failure_handler: lexik_jwt_authentication.handler.authentication_failure
api:
pattern: ^/api
stateless: true
jwt: ~
N'oubliez pas d'ajouter la route correspondante dans votre fichier routes.yaml :
api_login_check:
path: /api/login_check
methods: ['POST']
5. Tester votre configuration
Pour vérifier que tout fonctionne, essayez de faire un POST sur /api/login_check avec vos credentials JSON. Vous devriez recevoir un magnifique token encodé.
Pour toutes les requêtes suivantes, il suffira d'ajouter ce header :
Authorization: Bearer VOTRE_TOKEN_ICI
Conclusion & Sources
Le JWT est puissant mais attention : il ne permet pas de "déconnecter" un utilisateur facilement côté serveur (puisque c'est stateless). Pour cela, il faudra regarder du côté des Refresh Tokens.
Sources fiables :