JWT.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. <?php
  2. class JWT {
  3. /**
  4. * Génération JWT
  5. * @param array $header Header du token
  6. * @param array $payload Payload du Token
  7. * @param string $secret Clé secrète
  8. * @param int $validity Durée de validité (en secondes)
  9. * @return string Token
  10. */
  11. public function generate(array $header, array $payload, string $secret, int $validity = 86400): string {
  12. if ($validity > 0) {
  13. $now = new DateTime();
  14. $expiration = $now->getTimestamp() + $validity;
  15. $payload['iat'] = $now->getTimestamp();
  16. $payload['exp'] = $expiration;
  17. }
  18. // On encode en base64
  19. $base64Header = base64_encode(json_encode($header));
  20. $base64Payload = base64_encode(json_encode($payload));
  21. // On "nettoie" les valeurs encodées
  22. // On retire les +, / et =
  23. $base64Header2 = str_replace(['+', '/', '='], ['-', '_', ''], $base64Header);
  24. $base64Payload2 = str_replace(['+', '/', '='], ['-', '_', ''], $base64Payload);
  25. // On génère la signature
  26. $secret2 = base64_encode($secret);
  27. $signature = hash_hmac('sha512', $base64Header2 . '.' . $base64Payload2, $secret2, true);
  28. $base64Signature = base64_encode($signature);
  29. $signature2 = str_replace(['+', '/', '='], ['-', '_', ''], $base64Signature);
  30. // On crée le token
  31. return $base64Header2 . '.' . $base64Payload2 . '.' . $signature2;
  32. }
  33. /**
  34. * Vérification du token
  35. * @param string $token Token à vérifier
  36. * @param string $secret Clé secrète
  37. * @return bool Vérifié ou non
  38. */
  39. public function check(string $token, string $secret): bool {
  40. // On récupère le header et le payload
  41. $header = $this->getHeader($token);
  42. $payload = $this->getPayload($token);
  43. // On génère un token de vérification
  44. $verifToken = $this->generate($header, $payload, $secret, 0);
  45. return $token === $verifToken;
  46. }
  47. /**
  48. * Récupère le header
  49. * @param string $token Token
  50. * @return array Header
  51. */
  52. public function getHeader(string $token) {
  53. // Démontage token
  54. $array = explode('.', $token);
  55. // On décode le header
  56. return json_decode(base64_decode($array[0]), true);
  57. }
  58. /**
  59. * Retourne le payload
  60. * @param string $token Token
  61. * @return array Payload
  62. */
  63. public function getPayload(string $token) {
  64. // Démontage token
  65. $array = explode('.', $token);
  66. // On décode le payload
  67. return json_decode(base64_decode($array[1]), true);
  68. }
  69. /**
  70. * Vérification de l'expiration
  71. * @param string $token Token à vérifier
  72. * @return bool Vérifié ou non
  73. */
  74. public function isExpired(string $token): bool {
  75. $payload = $this->getPayload($token);
  76. $now = new DateTime();
  77. return $payload['exp'] < $now->getTimestamp();
  78. }
  79. /**
  80. * Vérification de la validité du token
  81. * @param string $token Token à vérifier
  82. * @return bool Vérifié ou non
  83. */
  84. public function isValid(string $token): bool {
  85. return preg_match(
  86. '/^[a-zA-Z0-9\-\_\=]+\.[a-zA-Z0-9\-\_\=]+\.[a-zA-Z0-9\-\_\=]+$/',
  87. $token
  88. ) === 1;
  89. }
  90. }