详解就算了吧,哈哈,自己去看 http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html

  1. <?php
  2.  
  3. /**
  4. JWT生成类
  5. **/
  6. class Jwt
  7. {
  8. private $alg = 'sha256';
  9.  
  10. private $secret = "123456";
  11.  
  12. /**
  13. * alg属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256);typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT
  14. */
  15. public function getHeader()
  16. {
  17. $header = [
  18. 'alg' => $this->alg,
  19. 'typ' => 'JWT'
  20. ];
  21.  
  22. return $this->base64urlEncode(json_encode($header, JSON_UNESCAPED_UNICODE));
  23. }
  24.  
  25. /**
  26. * Payload 部分也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用,这里可以存放私有信息,比如uid
  27. * @param $uid int 用户id
  28. * @return mixed
  29. */
  30. public function getPayload($uid)
  31. {
  32. $payload = [
  33. 'iss' => 'admin', //签发人
  34. 'exp' => time() + 600, //过期时间
  35. 'sub' => 'test', //主题
  36. 'aud' => 'every', //受众
  37. 'nbf' => time(), //生效时间
  38. 'iat' => time(), //签发时间
  39. 'jti' => 10001, //编号
  40. 'uid' => $uid, //私有信息,uid
  41. ];
  42.  
  43. return $this->base64urlEncode(json_encode($payload, JSON_UNESCAPED_UNICODE));
  44. }
  45.  
  46. /**
  47. * 生成token,假设现在payload里面只存一个uid
  48. * @param $uid int
  49. * @return string
  50. */
  51. public function genToken($uid)
  52. {
  53. $header = $this->getHeader();
  54. $payload = $this->getPayload($uid);
  55.  
  56. $raw = $header . '.' . $payload;
  57. $token = $raw . '.' . hash_hmac($this->alg, $raw, $this->secret);
  58.  
  59. return $token;
  60. }
  61.  
  62.  
  63. /**
  64. * 解密校验token,成功的话返回uid
  65. * @param $token
  66. * @return mixed
  67. */
  68. public function verifyToken($token)
  69. {
  70. if (!$token) {
  71. return false;
  72. }
  73. $tokenArr = explode('.', $token);
  74. if (count($tokenArr) != 3) {
  75. return false;
  76. }
  77. $header = $tokenArr[0];
  78. $payload = $tokenArr[1];
  79. $signature = $tokenArr[2];
  80.  
  81. $payloadArr = json_decode($this->base64urlDecode($payload), true);
  82.  
  83. if (!$payloadArr) {
  84. return false;
  85. }
  86.  
  87. //已过期
  88. if (isset($payloadArr['exp']) && $payloadArr['exp'] < time()) {
  89. return false;
  90. }
  91.  
  92. $expected = hash_hmac($this->alg, $header . '.' . $payload, $this->secret);
  93.  
  94. //签名不对
  95. if ($expected !== $signature) {
  96. return false;
  97. }
  98.  
  99. return $payloadArr['uid'];
  100. }
  101.  
  102. /**
  103. * 安全的base64 url编码
  104. * @param $data
  105. * @return string
  106. */
  107. private function base64urlEncode($data)
  108. {
  109. return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
  110. }
  111.  
  112. /**
  113. * 安全的base64 url解码
  114. * @param $data
  115. * @return bool|string
  116. */
  117. private function base64urlDecode($data)
  118. {
  119. return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
  120. }
  121. }

调用示例

  1. $jt = new Jwt();
  2. //获取token
  3. $token = $jt->genToken(1);
  4. var_dump($token);
  5. //解密token
  6. $uid = $jt->verifyToken($token);
  7.  
  8. var_dump($uid);

相关评论(0)
您是不是忘了说点什么?

友情提示:垃圾评论一律封号...

还没有评论,快来抢沙发吧!