当前位置:   article > 正文

TP8 利用jwt 生成token

TP8 利用jwt 生成token

使用Composer安装依赖库,终端切换到项目根目录输入如下

composer require firebase/php-jwt

下面是示例代码

  1. <?php
  2. namespace app\common\base;
  3. use Firebase\JWT\JWT;
  4. use Firebase\JWT\Key;
  5. class Token
  6. {
  7. /**
  8. * 创建 token
  9. * @param array $data 必填 自定义参数数组
  10. * @param integer $exp_time 必填 token过期时间 单位:秒 例子:7200=2小时
  11. * @param string $scopes 选填 token标识,请求接口的token
  12. * @return string
  13. */
  14. public static function createToken($data = "", $exp_time = 0, $scopes = "")
  15. {
  16. //JWT标准规定的声明,但不是必须填写的;
  17. //iss: jwt签发者
  18. //sub: jwt所面向的用户
  19. //aud: 接收jwt的一方
  20. //exp: jwt的过期时间,过期时间必须要大于签发时间
  21. //nbf: 定义在什么时间之前,某个时间点后才能访问
  22. //iat: jwt的签发时间
  23. //jti: jwt的唯一身份标识,主要用来作为一次性token。
  24. //公用信息
  25. $key = 'api'; //自定义一个key
  26. $time = time(); //当前时间
  27. $token['iss'] = ''; //签发者 可选
  28. $token['aud'] = ''; //接收该JWT的一方,可选
  29. $token['iat'] = $time; //签发时间
  30. $token['nbf'] = $time; //(Not Before):某个时间点后才能访问,比如设置time+30,表示当前时间30秒后才能使用
  31. if ($scopes) {
  32. $token['scopes'] = $scopes; //token标识,请求接口的token
  33. }
  34. if (!$exp_time) {
  35. $exp_time = 7200*12;//默认=24小时过期
  36. }
  37. $token['exp'] = $time + $exp_time; //token过期时间,这里设置2个小时
  38. if ($data) {
  39. $token['data'] = $data; //自定义参数
  40. }
  41. $alg = 'HS256'; //签名算法方式
  42. // $keyId = "keyId"; //这个有时必须要加上,不加上,报错,报错内容:'"kid" empty, unable to lookup correct key'
  43. $jwt = JWT::encode($token, $key, $alg);
  44. return $jwt; //返回给客户端token信息
  45. }
  46. /**
  47. * 验证token是否有效,默认验证exp,nbf,iat时间
  48. * @param string $jwt 需要验证的token
  49. * @return string $msg 返回消息
  50. */
  51. public static function explainToken($jwt)
  52. {
  53. $key = new Key('api', 'HS256'); // 必须是 Firebase\JWT\Key;的对象
  54. JWT::$leeway = 60;//当前时间减去60,把时间留点余地
  55. try {
  56. $decoded = JWT::decode($jwt, $key);
  57. $arr = (array)$decoded;
  58. $returndata['code'] = "200";//200=成功
  59. $returndata['msg'] = "成功";//
  60. $returndata['data'] = $arr;//返回的数据
  61. return json_encode($returndata); //返回信息
  62. } catch (\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
  63. $returndata['code'] = "101";//101=签名不正确
  64. $returndata['msg'] = $e->getMessage();
  65. $returndata['data'] = "";//返回的数据
  66. return json_encode($returndata); //返回信息
  67. } catch (\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
  68. $returndata['code'] = "102";//102=签名不正确
  69. $returndata['msg'] = $e->getMessage();
  70. $returndata['data'] = "";//返回的数据
  71. return json_encode($returndata); //返回信息
  72. } catch (\Firebase\JWT\ExpiredException $e) { // token过期
  73. $returndata['code'] = "103";//103=签名不正确
  74. $returndata['msg'] = $e->getMessage();
  75. $returndata['data'] = "";//返回的数据
  76. return json_encode($returndata); //返回信息
  77. } catch (Exception $e) { //其他错误
  78. $returndata['code'] = "199";//199=签名不正确
  79. $returndata['msg'] = $e->getMessage();
  80. $returndata['data'] = "";//返回的数据
  81. return json_encode($returndata); //返回信息
  82. }
  83. }
  84. }

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/499974
推荐阅读
相关标签
  

闽ICP备14008679号