OAuth 2.0 et autorisation JWT en PHP : guide pratique complet

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction à OAuth 2.0 et JWT en PHP

\n

Les 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é.

\n

Vous 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\n

Fondamentaux du protocole OAuth 2.0

\n

OAuth 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\n

Rô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
\n\n

Flux d'obtention du jeton via Authorization Code Grant

\n
    \n
  1. L'utilisateur accède à la page d'autorisation
  2. \n
  3. Après connexion, l'utilisateur est redirigé vers l'application avec un code temporaire
  4. \n
  5. Le serveur PHP échange le code contre un access_token et un refresh_token
  6. \n
  7. Toutes les requêtes suivantes à l'API sont effectuées avec l'en-tête Authorization: Bearer <access_token>
  8. \n
\n\n

Implémentation de JWT en PHP avec la bibliothèque firebase/php-jwt

\n

Pour travailler avec JWT en PHP, nous utiliserons la bibliothèque populaire firebase/php-jwt. Installons-la via Composer :

\n
composer require firebase/php-jwt
\n\n

Génération d'un jeton JWT

\n

Cré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\n

Vérification du jeton JWT

\n

Vé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\n

Middleware pour la vérification JWT

\n

Exemple 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                

Blogs

Book Recommendations