Introduction à OAuth 2.0 et JWT en PHP
\nLes applications web modernes s'éloignent de plus en plus de l'authentification classique par session au profit de solutions plus flexibles et évolutives. Deux protocoles clés — OAuth 2.0 et JWT (JSON Web Tokens) — sont devenus le standard de facto pour l'autorisation dans les API REST, les applications mobiles et l'architecture de microservices. Dans cet article, nous allons voir, à l'aide d'exemples pratiques, comment implémenter OAuth 2.0 et l'autorisation JWT en PHP, en utilisant des bibliothèques modernes et les meilleures pratiques de sécurité.
\nVous apprendrez à configurer un serveur d'autorisation, à émettre et vérifier des jetons JWT, à organiser la délivrance de refresh tokens et à sécuriser vos points de terminaison API. Tous les exemples de code sont prêts à être utilisés dans vos projets.
\n\nFondamentaux du protocole OAuth 2.0
\nOAuth 2.0 est un protocole d'autorisation qui permet aux applications d'obtenir un accès limité aux ressources d'un utilisateur sans transmettre ses identifiants. Dans le contexte d'une application PHP, OAuth 2.0 est généralement implémenté via le grant de code d'autorisation (Authorization Code Grant) ou le grant de mot de passe (Password Grant) pour les services internes.
\n\nRôles clés dans OAuth 2.0
\n- \n
- Resource Owner — l'utilisateur qui possède les données \n
- Client — l'application qui demande l'accès (par exemple, votre frontend PHP) \n
- Authorization Server — le serveur qui délivre les jetons \n
- Resource Server — le serveur qui fournit les ressources protégées (votre API) \n
Flux d'obtention du jeton via Authorization Code Grant
\n- \n
- L'utilisateur accède à la page d'autorisation \n
- Après connexion, l'utilisateur est redirigé vers l'application avec un code temporaire \n
- Le serveur PHP échange le code contre un access_token et un refresh_token \n
- Toutes les requêtes suivantes à l'API sont effectuées avec l'en-tête
Authorization: Bearer <access_token>\n
Implémentation de JWT en PHP avec la bibliothèque firebase/php-jwt
\nPour travailler avec JWT en PHP, nous utiliserons la bibliothèque populaire firebase/php-jwt. Installons-la via Composer :
composer require firebase/php-jwt\n\nGénération d'un jeton JWT
\nCréons une fonction pour émettre un jeton d'accès avec une charge utile (claims) :
\n<?php\nuse Firebase\\JWT\\JWT;\nuse Firebase\\JWT\\Key;\n\nfunction generateAccessToken(int $userId, string $email): string {\n $secretKey = 'your-256-bit-secret-key-here';\n $issuedAt = time();\n $expirationTime = $issuedAt + 3600; // 1 heure\n\n $payload = [\n 'iss' => 'pythonlib.ru',\n 'iat' => $issuedAt,\n 'exp' => $expirationTime,\n 'sub' => $userId,\n 'email' => $email,\n 'roles' => ['user']\n ];\n\n return JWT::encode($payload, $secretKey, 'HS256');\n}\n\nVérification du jeton JWT
\nVérification de l'authenticité du jeton à chaque requête vers une ressource protégée :
\n<?php\nfunction validateAccessToken(string $token): ?object {\n $secretKey = 'your-256-bit-secret-key-here';\n try {\n $decoded = JWT::decode($token, new Key($secretKey, 'HS256'));\n return $decoded;\n } catch (\\Exception $e) {\n // Jeton expiré, invalide ou signature incorrecte\n return null;\n }\n}\n\nMiddleware pour la vérification JWT
\nExemple d'un middleware simple utilisable avec n'importe quel framework :
\n<?php\nfunction authMiddleware(): ?object {\n $headers = getallheaders();\n $authHeader = $headers['Authorization'] ?? '';\n\n if (!preg_match('/Bearer\\s(\\S+)/', $authHeader, $matches)) {\n http_response_code(401);\n echo json_encode(['error' => 'Jeton non fourni']);\n exit;\n }\n\n $token = $matches[1];\n $user = validateAccessToken($token);\n\n if (!$user) {\n http_response_code(401);\n