2
0

jwt.class.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. <?php
  2. class jwt
  3. {
  4. private static $jwtToken;
  5. private static $jwtSecret = JWT_PRIVATE_KEY; // Clé secrète pour signer les tokens
  6. private static $jwtAlgorithm = "HS256"; // Algorithme utilisé pour signer le JWT (HS256)
  7. /**
  8. * Initialiser les configurations pour l'authentification
  9. */
  10. public static function init($loginUrl, $apiBaseUrl, $email, $password)
  11. {
  12. // Le JWT sera stocké dans cette propriété statique
  13. self::$jwtToken = null;
  14. }
  15. public static function checkSession()
  16. {
  17. // Vérifie si le JWT existe et n'est pas expiré
  18. if (self::$jwtToken && self::validateToken(self::$jwtToken)) {
  19. return json_encode(['authenticated' => true, 'token' => self::$jwtToken]);
  20. } else {
  21. return json_encode(['authenticated' => false]);
  22. }
  23. }
  24. /**
  25. * Authentifier l'utilisateur et récupérer le JWT
  26. */
  27. public static function authenticate(array $_input)
  28. {
  29. $user = user::authenticator($_input);
  30. if ($user["status"] == "success") {
  31. // Générer le JWT
  32. $user["token"] = self::generateToken($user);
  33. self::$jwtToken = $user["token"];
  34. return $user;
  35. }
  36. }
  37. /**
  38. * Faire une requête API authentifiée avec le JWT
  39. */
  40. public static function makeAuthenticatedRequest($endpoint, $method = 'GET', $data = [])
  41. {
  42. if (!self::$jwtToken) {
  43. throw new Exception('Aucun jeton JWT disponible. Veuillez vous authentifier.');
  44. }
  45. // Vérification du token avant d'effectuer une requête
  46. if (!self::validateToken(self::$jwtToken)) {
  47. throw new Exception('Jeton JWT invalide ou expiré. Veuillez vous authentifier à nouveau.');
  48. }
  49. $ch = curl_init();
  50. $url = DOMAIN_API . $endpoint;
  51. curl_setopt($ch, CURLOPT_URL, $url . "/");
  52. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  53. // Ajouter le JWT dans l'en-tête d'autorisation
  54. curl_setopt($ch, CURLOPT_HTTPHEADER, [
  55. 'Authorization: Bearer ' . self::$jwtToken,
  56. 'Content-Type: application/json'
  57. ]);
  58. // Configuration des méthodes GET/POST/PUT/DELETE
  59. if ($method === 'POST') {
  60. curl_setopt($ch, CURLOPT_POST, true);
  61. curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
  62. } elseif ($method === 'PUT') {
  63. curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
  64. curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
  65. } elseif ($method === 'DELETE') {
  66. curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
  67. }
  68. $response = curl_exec($ch);
  69. curl_close($ch);
  70. if ($response === false) {
  71. throw new Exception('Erreur lors de la requête API.');
  72. }
  73. return json_decode($response, true);
  74. }
  75. public static function refreshToken(string $expiredToken)
  76. {
  77. // Décoder le token sans vérifier son expiration
  78. $tokenParts = explode('.', $expiredToken);
  79. if (count($tokenParts) !== 3) {
  80. return null; // Token incorrect
  81. }
  82. $header = $tokenParts[0];
  83. $payload = $tokenParts[1];
  84. $signatureProvided = $tokenParts[2];
  85. // Vérifier la signature
  86. $signatureValid = hash_hmac('sha256', $header . '.' . $payload, self::$jwtSecret, true);
  87. $base64UrlSignature = self::base64UrlEncode($signatureValid);
  88. if ($base64UrlSignature !== $signatureProvided) {
  89. return null; // Signature incorrecte
  90. }
  91. // Décoder le payload
  92. $payloadDecoded = json_decode(self::base64UrlDecode($payload), true);
  93. // Vérifier si le token est expiré
  94. if (isset($payloadDecoded['exp']) && time() < $payloadDecoded['exp']) {
  95. return $expiredToken; // Le token n'est pas encore expiré, inutile de le rafraîchir
  96. }
  97. // Le token est expiré, régénérer un nouveau token avec les mêmes données mais une nouvelle expiration
  98. unset($payloadDecoded['exp']); // On enlève l'expiration actuelle
  99. $new = self::generateToken($payloadDecoded); // Générer un nouveau token
  100. user::updateJWTbyMd5(md5($expiredToken), $new);
  101. return $new;
  102. }
  103. /**
  104. * Déconnexion (facultatif) : Révoquer le token
  105. */
  106. public static function logout()
  107. {
  108. self::$jwtToken = null; // Supprimer le JWT
  109. }
  110. /**
  111. * Générer un JWT avec un payload
  112. */
  113. private static function generateToken($payload)
  114. {
  115. $header = json_encode([
  116. 'typ' => 'JWT',
  117. 'alg' => self::$jwtAlgorithm
  118. ]);
  119. $base64UrlHeader = self::base64UrlEncode($header);
  120. $base64UrlPayload = self::base64UrlEncode(json_encode($payload));
  121. // Créer la signature
  122. $signature = hash_hmac('sha256', $base64UrlHeader . "." . $base64UrlPayload, self::$jwtSecret, true);
  123. $base64UrlSignature = self::base64UrlEncode($signature);
  124. // Retourner le token complet
  125. return $base64UrlHeader . "." . $base64UrlPayload . "." . $base64UrlSignature;
  126. }
  127. /**
  128. * Valider un JWT
  129. */
  130. public static function validateToken(string $token)
  131. {
  132. $baseJWT = user::getInfosByJWT($token);
  133. if($baseJWT == FALSE){
  134. return false; // Token en base expirée
  135. }
  136. $tokenParts = explode('.', $token);
  137. if (count($tokenParts) !== 3) {
  138. return false; // Token incorrect
  139. }
  140. $header = $tokenParts[0];
  141. $payload = $tokenParts[1];
  142. $signatureProvided = $tokenParts[2];
  143. // Vérifier la signature
  144. $signatureValid = hash_hmac('sha256', $header . '.' . $payload, self::$jwtSecret, true);
  145. $base64UrlSignature = self::base64UrlEncode($signatureValid);
  146. if ($base64UrlSignature !== $signatureProvided) {
  147. return false; // Signature incorrecte
  148. }
  149. // Décoder le payload
  150. $payloadDecoded = json_decode(self::base64UrlDecode($payload), true);
  151. // Vérifier l'expiration du token
  152. if (isset($payloadDecoded['exp']) && time() >= $payloadDecoded['exp']) {
  153. return false; // Token expiré
  154. }
  155. return true; // Token valide
  156. }
  157. /**
  158. * Méthode utilitaire pour Base64 URL encoding
  159. */
  160. private static function base64UrlEncode($data)
  161. {
  162. return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
  163. }
  164. /**
  165. * Méthode utilitaire pour Base64 URL decoding
  166. */
  167. private static function base64UrlDecode($data)
  168. {
  169. return base64_decode(strtr($data, '-_', '+/'));
  170. }
  171. }