TP6 使用jwt生成token加密解密

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

猜你喜欢

转载自blog.csdn.net/munchmills/article/details/127545633