这篇文章主要给大家介绍了关于php实现JWT验证的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

JWT,全称 Json web token,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

php实现JWT,本例使用thinkphp框架,代码如下:

在vendor包中建立Jwt.php,建立类文件

  1. class Jwt {
  2. //头部
  3. private static $header=array(
  4. 'alg'=>'HS256', //生成signature的算法
  5. 'typ'=>'JWT' //类型
  6. );
  7. //使用HMAC生成信息摘要时所使用的密钥
  8. private static $key='123456';
  9. /**
  10. * 获取jwt token
  11. * @param array $payload jwt载荷 格式如下非必须
  12. * [
  13. * 'iss'=>'jwt_admin', //该JWT的签发者
  14. * 'iat'=>time(), //签发时间
  15. * 'exp'=>time()+7200, //过期时间
  16. * 'nbf'=>time()+60, //该时间之前不接收处理该Token
  17. * 'sub'=>'www.admin.com', //面向的用户
  18. * 'jti'=>md5(uniqid('JWT').time()) //该Token唯一标识
  19. * ]
  20. * @return bool|string
  21. */
  22. public static function getToken($payload)
  23. {
  24. if(is_array($payload))
  25. {
  26. $base64header=self::base64UrlEncode(json_encode(self::$header,JSON_UNESCAPED_UNICODE));
  27. $base64payload=self::base64UrlEncode(json_encode($payload,JSON_UNESCAPED_UNICODE));
  28. $token=$base64header.'.'.$base64payload.'.'.self::signature($base64header.'.'.$base64payload,self::$key,self::$header['alg']);
  29. return $token;
  30. }else{
  31. return false;
  32. }
  33. }
  34. /**
  35. * 验证token是否有效,默认验证exp,nbf,iat时间
  36. * @param string $Token 需要验证的token
  37. * @return bool|string
  38. */
  39. public static function verifyToken($Token)
  40. {
  41. $tokens = explode('.', $Token);
  42. if (count($tokens) != 3)
  43. return false;
  44. list($base64header, $base64payload, $sign) = $tokens;
  45. //获取jwt算法
  46. $base64decodeheader = json_decode(self::base64UrlDecode($base64header), JSON_OBJECT_AS_ARRAY);
  47. if (empty($base64decodeheader['alg']))
  48. return false;
  49. //签名验证
  50. if (self::signature($base64header . '.' . $base64payload, self::$key, $base64decodeheader['alg']) !== $sign)
  51. return false;
  52. $payload = json_decode(self::base64UrlDecode($base64payload), JSON_OBJECT_AS_ARRAY);
  53. //签发时间大于当前服务器时间验证失败
  54. if (isset($payload['iat']) && $payload['iat'] > time())
  55. return false;
  56. //过期时间小宇当前服务器时间验证失败
  57. if (isset($payload['exp']) && $payload['exp'] < time())
  58. return false;
  59. //该nbf时间之前不接收处理该Token
  60. if (isset($payload['nbf']) && $payload['nbf'] > time())
  61. return false;
  62. return $payload;
  63. }
  64. /**
  65. * base64UrlEncode https://jwt.io/ 中base64UrlEncode编码实现
  66. * @param string $input 需要编码的字符串
  67. * @return string
  68. */
  69. private static function base64UrlEncode($input)
  70. {
  71. return str_replace('=', '', strtr(base64_encode($input), '+/', '-_'));
  72. }
  73. /**
  74. * base64UrlEncode https://jwt.io/ 中base64UrlEncode解码实现
  75. * @param string $input 需要解码的字符串
  76. * @return bool|string
  77. */
  78. private static function base64UrlDecode($input)
  79. {
  80. $remainder = strlen($input) % 4;
  81. if ($remainder) {
  82. $addlen = 4 - $remainder;
  83. $input .= str_repeat('=', $addlen);
  84. }
  85. return base64_decode(strtr($input, '-_', '+/'));
  86. }
  87. /**
  88. * HMACSHA256签名 https://jwt.io/ 中HMACSHA256签名实现
  89. * @param string $input 为base64UrlEncode(header).".".base64UrlEncode(payload)
  90. * @param string $key
  91. * @param string $alg 算法方式
  92. * @return mixed
  93. */
  94. private static function signature($input, $key, $alg = 'HS256')
  95. {
  96. $alg_config=array(
  97. 'HS256'=>'sha256'
  98. );
  99. return self::base64UrlEncode(hash_hmac($alg_config[$alg], $input, $key,true));
  100. }
  101. }

调用JWT验证的方法,代码如下:

1.构建token方法

  1. public function makeToken(){
  2. $uname=$this->uname; $currtime=time();
  3. if(empty($this->uname)){ echo json_encode(array('code'=>-1,'msg'=>'[主账号]参数为空'),JSON_UNESCAPED_UNICODE); exit(); }
  4. ....
  5. //jwt验证
  6. vendor("Jwt.Jwt");
  7. $jwt = new \Jwt();
  8. //这里构造jwt参数,可以参照jwt规范,各字段可以自行定义内容 $payload=array('iss'=>'xesport','sub'=>'xxx_player','name'=>$playerName,'iat'=>$currtime,'jti'=>md5(uniqid('JWT').$currtime));
  9. $token=$jwt->getToken($payload); $this->token=$token;
  10. $url='http://xxx?token='.$token;
  11. $data=array('url'=>$url);
  12. echo json_encode(array('code'=>1,'data'=>$data,),JSON_UNESCAPED_UNICODE); exit();
  13. }

2.验证token的方法

  1. //验证token
  2. public function verifyToken(){
  3. $token=$_REQUEST['token'];
  4. if(empty($token)){ echo json_encode(array('code'=>-1,'msg'=>'[token]参数为空!'),JSON_UNESCAPED_UNICODE); exit(); }
  5. vendor("Jwt.Jwt");
  6. $jwt = new \Jwt();
  7. $res_token=$jwt->verifyToken($token);
  8. //var_dump('res_token==',$res_token);
  9. if(empty($res_token)){ echo json_encode(array('code'=>-2,'msg'=>'[token]验证失败!'),JSON_UNESCAPED_UNICODE); exit(); }
  10. $playerName=$res_token['name'];
  11. //echo $playerName; die;
  12. 这里可以写从数据库查询验证user是否存在,返回 $userInfo
  13. if(empty($userInfo)){ echo json_encode(array('code'=>-3,'msg'=>'[token]验证用户无效!'),JSON_UNESCAPED_UNICODE); exit(); }
  14. $data=array('username'=>$playerName);
  15. echo json_encode(array('code'=>1,'data'=>$data,'msg'=>'[token]验证成功'),JSON_UNESCAPED_UNICODE); exit();
  16. }

这样,我们通过控制器方法调用该方法,传递参数token,就可以解析token中包含的认证凭据信息,从而做后续业务处理逻辑。

到此这篇关于php实现JWT验证的文章就介绍到这了。

更多相关文章

  1. Android(安卓)获取时间实例代码
  2. RTC,system timer, android时间日期管理
  3. Android(安卓)邮箱验证
  4. android 中 系统日期时间的获取
  5. android 闹钟定时任务 AlarmManager
  6. Android(安卓)- 比较日期的时间部分
  7. Android闹钟服务AlarmManager
  8. Android(安卓)检测用户一段时间无操作
  9. android 时间戳与日期格式的互相转换 以及 自定义选择器

随机推荐

  1. 粗见之正则表达式
  2. 如何在Javascript中从Json数组创建路径路
  3. jQuery插件:如何将元素引用传递给回调函数
  4. 动态的JQUERY追加父子div。
  5. 在textarea上应用0高度div的类
  6. 我可以在JavaScript中从不同的页面传递参
  7. 为什么我不能删除数组的元素?
  8. JS 模仿块级作用域
  9. Javascript 面向对象编程(一):封装
  10. 轮播图---可以动态添加图片,(封装成一个函