🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
jwt、tp中间件听起来好高大上的样子。 花了两天时间阅读文档和看视频,终于懂了点皮毛,在这里记录一下。 以下两个问题需要搞懂 1  jwt 是什么 ? JWT 全称 Json Web token,是为了在网络应用环境间传递声明而执行的一种基于json的开放标准(RFC 7519),该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者之间传递被认证的用户身份信息,以便于从服务器获取资源,也可以增加一些额外的其他业务逻辑所必须的声明信息,该token也可之间被用于认证,也可以被加密。 简而言之,我们这里要用到的就是jwt的加密和解密。 先简单记录一下 第一步 安装jwt扩展 建议使用composer安装 方便 快捷 composer require firebase/php-jwt 运行成功后显示 图一 图二即安装成功: 图一: ![](https://img.kancloud.cn/f3/1f/f31f24702f467493278ef3aa8508bc1c_601x307.png) ![](https://img.kancloud.cn/ae/a4/aea48e01ab1e57efa1b8c57a9d4c8471_334x282.png) 第二步 调用 JWT里面的 encode 和 decode方法进行生成token和验证token 我是在app 目录下的 common.php 文件使用的 ,做成了公共方法  首先 引入 JWT ,然后写两个方法,生成验签和验证token。 ~~~php use \Firebase\JWT\JWT; ~~~ ``` <?php /\*  \* @Descripttion: 梧桐树科技  \* @version: 1.0.1  \* @Author: yms  \* @Date: 2022-05-24 11:02:26  \* @LastEditors: ymsxxx  \* @LastEditTime: 2022-05-25 00:07:58  \*/ namespace wt\\pluadd\\velogic; use Firebase\\JWT\\JWT; use Firebase\\JWT\\Key; /\*\*  \* @description: jwt验证  \* @Date: 2022-05-24 11:03:55 \* @return {\*}  \* @LastEditTime: Do not Edit  \*/ class VerufyJwt{ //生成验签 public function signToken($uid){ $key \= '!@#$%\*&'; //这里是自定义的一个随机字串,应该写在config文件中的,解密时也会用,相当    于加密中常用的 盐  salt $nowtime \= time(); echo ($nowtime + 100) . ''; /\*         iss: jwt签发者         sub: jwt所面向的用户         aud: 接收jwt的一方         exp: jwt的过期时间,这个过期时间必须要大于签发时间         nbf: 定义在什么时间之前,该jwt都是不可用的.         iat: jwt的签发时间         jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。         \*/ $token \= array( "iss" \=> $key,//签发者 可以为空 "aud" \=> '',          //面象的用户 可以为空 "iat" \=> $nowtime,//签发时间 "nbf" \=> $nowtime + 3,    //在什么时候jwt开始生效 "jti" \=> md5(uniqid('JWT') . time()),    //该Token唯一标识 "exp" \=> $nowtime + 200, //token过期时间 "data" \=> \[ //记录的userid的信息,这里是自已添加上去的,如果有其它信息,可以再添加数组的键值对 'uid' \=> $uid,             \]         ); $jwt \= JWT::encode($token, $key, "HS256");  //根据参数生成了 token echo $jwt;     } //验证token function checkToken($token)     { //$token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIhQCMkJSomIiwiYXVkIjoiIiwiaWF0IjoxNjI2NzA2NzgxLCJuYmYiOjE2MjY3MDY3ODQsImp0aSI6ImE0YmE2YTE5NzlkNjcyMDFlOGM1YjQxOWExNjI2ZmUxIiwiZXhwIjoxNjI2NzA2ODgxLCJkYXRhIjp7InVpZCI6MzMwMX19.LZI8WfvNA\_tqkE9Nop35Doa-wWw4R\_ZQlsiZn50Un7w'; $key \= '!@#$%\*&'; $status \= array("code" \=> 2); try { JWT::$leeway \= 60; //当前时间减去60,把时间留点余地,避免多服务器时间有误差,设置leeway后,token的有效时间就是exp+leeway $decoded \= JWT::decode($token, $key, array('HS256')); //HS256方式,这里要和签发的时候对应 $arr \= (array)$decoded;             $res\['code'\] \= 1;             $res\['data'\] \= $arr\['data'\]; print\_r($res); } catch (\\Firebase\\JWT\\SignatureInvalidException $e) { //签名不正确             $status\['msg'\] \= "签名不正确"; print\_r($status); } catch (\\Firebase\\JWT\\BeforeValidException $e) { // 签名在某个时间点之后才能用             $status\['msg'\] \= "token失效"; print\_r($status); } catch (\\Firebase\\JWT\\ExpiredException $e) { // token过期             $status\['msg'\] \= "token失效"; print\_r($status); } catch (Exception $e) { //其他错误             $status\['msg'\] \= "未知错误"; print\_r($status);         }     } } ``` 第三步:使用。 生成token ,这里是把用户id进行加密,当然还可以添加其他参数,比如 ip,手机号,账户名等等。把要加密的信息传给 singToken方法就可以。 1. $user\['token'\] = signToken($user\['id'\]); 4. // token 返回值 6. //eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJtZGMhQCMkIiwiYXVkIjoiIiwiaWF0IjoxNTc5MTU3OTY4LCJuYmYiOjE1NzkxNTc5NzEsImV4cCI6MTU3OTE1ODE2OCwiZGF0YSI6eyJ1aWQiOjV9fQ.mFdRYr\_sf63U5STJoxfOFFRyJj8V4N\_h-sx3hQcZ2qk 验证 token ,这里的token一般用 header 方式传送,接收后直接调用 直接调用 common.php 文件的 checkToken方法即可。验证成功返回加密的token信息。验证失败返回提示信息。 1. $token = Request::instance()->header('token'); 2. $res = checkToken($token);