第一步,需要安装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"=>"登录异常,请从新登录"]);
}