第一步,需要安装TP6框架,如果没有安装我给你一个composer
composer create-project topthink/think tp
第二步,需要安装一个PHP的jwt插件,也使用composer
composer require firebase/php-jwt
第三步,我们需要在文件里引用jwt
use Firebase\JWT\JWT;use Firebase\JWT\Key;//key也要引用哦!
第四部,我们就可以开始加密了!
public function createjwt(){$key='123ABC)!$';//这里是你的秘钥,需要和解密是保持一致! $token = array("iss" => 'weixin', //签发者 可以为空"aud" => 'spospone', //面象的用户,可以为空"iat" => time(), //签发时间"nbf" => time(), //立马生效"exp" => time() + 7200, //token 过期时间 两小时"data" => [ //这里是的数据参数等,需要保存和取出的 'id' => '1',]);return JWT::encode($token, $key, "HS256");}
第五步,上面如果能获得正常的token值,我们可以开始解密
public function checkToken($jwt = '') { try {$key ='123ABC)!$';//这里是你的秘钥,需要和解密是保持一致! JWT::$leeway = 30; //当前时间减去30,把时间留点余地 $decoded = JWT::decode($jwt, new Key($key, 'HS256')); //上面这个解密很多都没有加new key();如下面图会报其他错误//$decoded = JWT::decode($jwt, $key, array('HS256')); $arr = (array)$decoded; $date['code']= "0"; $date['data']= $arr;//数据输出 } catch (\Firebase\JWT\SignatureInvalidException $e) { $date['code'] = "-1";$date['msg'] = '签名不正确'; } catch (\Firebase\JWT\BeforeValidException $e) { $date['code'] = "-1"; $date['msg'] = 'TOken 还没有生效'; } catch (\Firebase\JWT\ExpiredException $e) { $date['code'] = "-1";$date['msg'] = 'token过期'; } catch (\Exception $e) { $date['code'] = "-1"; $date['msg'] = '其他错误'; } return json_encode($date, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); }
完毕!总结:主要可能出问题的地方就是new key()这个地方,下面的都是正常的判断逻辑,很报错逻辑,希望对你在使用JWT的时候有帮助!
上面完成之后我在使用过程中还是遇到点小问题,就是在项目解密的时候!我把第5步修改一下,然后做一个调用!
另外方案第五步:
//解密方法public function checkToken($jwt = '') { try { JWT::$leeway = 30; //当前时间减去30,把时间留点余地 $decoded = JWT::decode($jwt, new Key($this->key, 'HS256')); //上面这个解密很多都没有加new key();如下面图会报其他错误//$decoded = JWT::decode($jwt, $key, array('HS256')); $arr = (array)$decoded; $date['code']= "0"; $date['data']= $arr;//数据输出 } catch (\Firebase\JWT\SignatureInvalidException $e) { $date['code'] = "-1";//$date['msg'] = '签名不正确'; } catch (\Firebase\JWT\BeforeValidException $e) { $date['code'] = "-1"; //$date['msg'] = 'TOken 还没有生效'; } catch (\Firebase\JWT\ExpiredException $e) { $date['code'] = "-2";//$date['msg'] = 'token过期'; } catch (\Exception $e) { $date['code'] = "-1"; //$date['msg'] = '其他错误'; } return $date; }
第六步来一个项目解密:
$res = request()->param();$index = new \app\controller\admin\PublicText($this->app);$tokenCode =$index->checkToken($res['access_token']);if(json_decode($tokenCode['code']) != '0'){return json([ "code"=> '1001',"msg"=>"登录异常,请从新登录"]);}
来源地址:https://blog.csdn.net/munchmills/article/details/127545633