Introduction à OAuth 2.0 et JWT en PHP
\n\nLes applications web modernes fonctionnent rarement sans systèmes d'autorisation. Les deux protocoles les plus populaires — OAuth 2.0 et JWT (JSON Web Token) — permettent aux développeurs de créer des solutions sécurisées et évolutives. Dans cet article, nous allons voir comment implémenter l'autorisation OAuth 2.0 et JWT en PHP de zéro. Le contenu est destiné aux débutants, donc tous les concepts seront expliqués en termes simples avec des exemples pratiques.
\n\nOAuth 2.0 est un protocole d'accès délégué. Il permet aux utilisateurs d'accorder à des tiers un accès limité à leurs ressources sans transmettre de mot de passe. JWT, quant à lui, est un format de jeton compact qui contient toutes les informations nécessaires sur l'utilisateur et ses droits.
\n\nQu'est-ce que JWT et comment fonctionne-t-il ?
\n\nJWT (JSON Web Token) est une norme ouverte (RFC 7519) qui définit un moyen compact et autonome de transmettre des informations entre les parties sous forme d'objet JSON. Le jeton se compose de trois parties séparées par des points :
\n\n- \n
- Header — contient des informations sur le type de jeton et l'algorithme de chiffrement (généralement HS256 ou RS256). \n
- Payload — contient les "revendications" (claims) : données utilisateur, heure d'émission (iat), heure d'expiration (exp) et autres. \n
- Signature — signature créée à partir du header, du payload et de la clé secrète. Garantit l'intégrité des données. \n
Voici à quoi ressemble un JWT typique :
\n\neyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6ItCQ0L3QsNGC0L7Qu9C40LkiLCJpYXQiOjE1MTYyMzkwMjJ9.4vGJ7qF6b0Q9l8z3X5p2Rk1h7t9y2w4z6x8c0v2b4n6m8\n\nL'avantage de JWT est que le serveur n'a pas besoin de stocker les sessions dans une base de données — toutes les informations sont déjà encodées dans le jeton. Cela rend le système facilement évolutif.
\n\nInstallation de la bibliothèque pour travailler avec JWT en PHP
\n\nPour travailler avec JWT en PHP, nous utiliserons la bibliothèque populaire firebase/php-jwt. Installez-la via Composer :
composer require firebase/php-jwt\n\nCréation et vérification d'un jeton JWT
\n\nExaminons un exemple de base de création d'un jeton lors de la connexion d'un utilisateur et de sa vérification lors d'une requête vers une ressource protégée.
\n\n1. Génération du jeton (login.php) :
\n\n<?php\nrequire_once 'vendor/autoload.php';\n\nuse Firebase\\JWT\\JWT;\nuse Firebase\\JWT\\Key;\n\n$secretKey = 'votre-clé-secrète-dau-moins-32-caractères';\n\n// Données utilisateur après authentification réussie\n$payload = [\n 'iss' => 'pythonlib.ru', // Émetteur du jeton\n 'sub' => $userId, // ID utilisateur\n 'name' => $userName, // Nom d'utilisateur\n 'role' => 'user', // Rôle\n 'iat' => time(), // Heure d'émission\n 'exp' => time() + 3600 // Le jeton expire dans 1 heure\n];\n\n$jwt = JWT::encode($payload, $secretKey, 'HS256');\n\n// Envoyer le jeton au client\necho json_encode(['token' => $jwt]);\n?>\n\n2. Vérification du jeton (profile.php) :
\n\n<?php\nrequire_once 'vendor/autoload.php';\n\nuse Firebase\\JWT\\JWT;\nuse Firebase\\JWT\\Key;\n\n$secretKey = 'votre-clé-secrète-dau-moins-32-caractères';\n\n// Récupérer le jeton depuis l'en-tête Authorization\n$headers = getallheaders();\n$authHeader = $headers['Authorization'] ?? '';\n\nif (preg_match('/Bearer\\s(\\S+)/', $authHeader, $matches)) {\n $jwt = $matches[1];\n \n try {\n $decoded = JWT::decode($jwt, new Key($secretKey, 'HS256'));\n \n // Le jeton est valide, récupérer les données utilisateur\n $userId = $decoded->sub;\n $userName = $decoded->name;\n \n // Retourner les données protégées\n echo json_encode(['status' => 'success', 'user' => $decoded]);\n \n } catch (Exception $e) {\n // Le jeton est invalide ou a expiré\n htt