| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- <?php
- class jwt
- {
- private static $jwtToken;
- private static $jwtSecret = JWT_PRIVATE_KEY; // Clé secrète pour signer les tokens
- private static $jwtAlgorithm = "HS256"; // Algorithme utilisé pour signer le JWT (HS256)
-
- /**
- * Initialiser les configurations pour l'authentification
- */
- public static function init($loginUrl, $apiBaseUrl, $email, $password)
- {
- // Le JWT sera stocké dans cette propriété statique
- self::$jwtToken = null;
- }
- public static function checkSession()
- {
- // Vérifie si le JWT existe et n'est pas expiré
- if (self::$jwtToken && self::validateToken(self::$jwtToken)) {
- return json_encode(['authenticated' => true, 'token' => self::$jwtToken]);
- } else {
- return json_encode(['authenticated' => false]);
- }
- }
- /**
- * Authentifier l'utilisateur et récupérer le JWT
- */
- public static function authenticate(array $_input)
- {
- $user = user::authenticator($_input);
- if ($user["status"] == "success") {
-
- // Générer le JWT
- $user["token"] = self::generateToken($user);
- self::$jwtToken = $user["token"];
- return $user;
- }
- }
- /**
- * Faire une requête API authentifiée avec le JWT
- */
- public static function makeAuthenticatedRequest($endpoint, $method = 'GET', $data = [])
- {
- if (!self::$jwtToken) {
- throw new Exception('Aucun jeton JWT disponible. Veuillez vous authentifier.');
- }
- // Vérification du token avant d'effectuer une requête
- if (!self::validateToken(self::$jwtToken)) {
- throw new Exception('Jeton JWT invalide ou expiré. Veuillez vous authentifier à nouveau.');
- }
- $ch = curl_init();
- $url = DOMAIN_API . $endpoint;
- curl_setopt($ch, CURLOPT_URL, $url . "/");
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- // Ajouter le JWT dans l'en-tête d'autorisation
- curl_setopt($ch, CURLOPT_HTTPHEADER, [
- 'Authorization: Bearer ' . self::$jwtToken,
- 'Content-Type: application/json'
- ]);
- // Configuration des méthodes GET/POST/PUT/DELETE
- if ($method === 'POST') {
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
- } elseif ($method === 'PUT') {
- curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
- curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
- } elseif ($method === 'DELETE') {
- curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
- }
- $response = curl_exec($ch);
- curl_close($ch);
- if ($response === false) {
- throw new Exception('Erreur lors de la requête API.');
- }
- return json_decode($response, true);
- }
- public static function refreshToken(string $expiredToken)
- {
- // Décoder le token sans vérifier son expiration
- $tokenParts = explode('.', $expiredToken);
- if (count($tokenParts) !== 3) {
- return null; // Token incorrect
- }
- $header = $tokenParts[0];
- $payload = $tokenParts[1];
- $signatureProvided = $tokenParts[2];
- // Vérifier la signature
- $signatureValid = hash_hmac('sha256', $header . '.' . $payload, self::$jwtSecret, true);
- $base64UrlSignature = self::base64UrlEncode($signatureValid);
- if ($base64UrlSignature !== $signatureProvided) {
- return null; // Signature incorrecte
- }
- // Décoder le payload
- $payloadDecoded = json_decode(self::base64UrlDecode($payload), true);
- // Vérifier si le token est expiré
- if (isset($payloadDecoded['exp']) && time() < $payloadDecoded['exp']) {
- return $expiredToken; // Le token n'est pas encore expiré, inutile de le rafraîchir
- }
- // Le token est expiré, régénérer un nouveau token avec les mêmes données mais une nouvelle expiration
- unset($payloadDecoded['exp']); // On enlève l'expiration actuelle
- $new = self::generateToken($payloadDecoded); // Générer un nouveau token
- user::updateJWTbyMd5(md5($expiredToken), $new);
- return $new;
- }
- /**
- * Déconnexion (facultatif) : Révoquer le token
- */
- public static function logout()
- {
- self::$jwtToken = null; // Supprimer le JWT
- }
- /**
- * Générer un JWT avec un payload
- */
- private static function generateToken($payload)
- {
- $header = json_encode([
- 'typ' => 'JWT',
- 'alg' => self::$jwtAlgorithm
- ]);
- $base64UrlHeader = self::base64UrlEncode($header);
- $base64UrlPayload = self::base64UrlEncode(json_encode($payload));
- // Créer la signature
- $signature = hash_hmac('sha256', $base64UrlHeader . "." . $base64UrlPayload, self::$jwtSecret, true);
- $base64UrlSignature = self::base64UrlEncode($signature);
- // Retourner le token complet
- return $base64UrlHeader . "." . $base64UrlPayload . "." . $base64UrlSignature;
- }
- /**
- * Valider un JWT
- */
- public static function validateToken(string $token)
- {
- $baseJWT = user::getInfosByJWT($token);
- if($baseJWT == FALSE){
- return false; // Token en base expirée
- }
- $tokenParts = explode('.', $token);
- if (count($tokenParts) !== 3) {
- return false; // Token incorrect
- }
- $header = $tokenParts[0];
- $payload = $tokenParts[1];
- $signatureProvided = $tokenParts[2];
- // Vérifier la signature
- $signatureValid = hash_hmac('sha256', $header . '.' . $payload, self::$jwtSecret, true);
- $base64UrlSignature = self::base64UrlEncode($signatureValid);
- if ($base64UrlSignature !== $signatureProvided) {
- return false; // Signature incorrecte
- }
- // Décoder le payload
- $payloadDecoded = json_decode(self::base64UrlDecode($payload), true);
- // Vérifier l'expiration du token
- if (isset($payloadDecoded['exp']) && time() >= $payloadDecoded['exp']) {
- return false; // Token expiré
- }
- return true; // Token valide
- }
- /**
- * Méthode utilitaire pour Base64 URL encoding
- */
- private static function base64UrlEncode($data)
- {
- return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
- }
- /**
- * Méthode utilitaire pour Base64 URL decoding
- */
- private static function base64UrlDecode($data)
- {
- return base64_decode(strtr($data, '-_', '+/'));
- }
- }
|