TP6 使用jwt生成token加密解密

本文介绍了如何在PHP项目中利用Composer安装php-jwt库,然后在代码中生成和解密JWTToken。详细步骤包括设置秘钥、创建生成Token的方法、解密Token的方法,并展示了在TP6框架的中间件中应用Token验证的示例。
摘要由CSDN通过智能技术生成

第一步 composer安装php-jwt插件(不止TP框架的其他框架也可以基本流程一样)

composer require firebase/php-jwt

第二步 在需要使用jwt的地方引用一下代码(建议直接在common公共文件中创建,使用时直接调用)


use Firebase\JWT\JWT;
use Firebase\JWT\Key;//key也要引用哦!

第三步 生成token方法 (建议直接放在公共文件中 common.php)


	/**
	 * Created by PhpStorm.
	 * @purpose 生成Token
	 * @Author: Linxy
	 * @Time: 2022/12/15 13:45
	 */
	function signToken($param): string
	{
		// $key='123ABC)!$';  //这里自定义秘钥,需要和解密是保持一致!
		$key = Env::get('JWT.KEY'); // 我封装在env里面了 
		
		$keyId = Env::get('JWT.KEY_ID');
		$onlyCode = uuid();
		$data['id'] = $id;
		$data['onlyCode'] = $onlyCode;
		$res = 查询数据库数据 或者更新登录时间参数
		$payload = array(
			"iss" => 'weixin',         //签发者 可以为空
			"aud" => 'spospone',       //面象的用户,可以为空
			"iat" => time(),           //签发时间
			'iat' => time(),			 // 开始时间
			'exp' => time() + Env::get('JWT.TTL'), // 到期时间
			'data' => $data // token的数据
		);
		$jwt = JWT::encode($payload, $key, 'HS256', $keyId);
		return $jwt;
	}

第四部 上面如果能获得正常的token值,我们可以开始解密

	/**
	 * Created by PhpStorm.
	 * @purpose 解密Token
	 * @Author: Linxy
	 * @Time: 2022/12/15 13:46
	 */
	function checkToken($token){
		$key = Env::get('JWT.KEY'); //自定义的一个随机字串用户于加密中常用的 盐  salt
		$res['status'] = false;
		try {
			JWT::$leeway    = 60;//当前时间减去60,把时间留点余地
			$decoded        = JWT::decode($token, new Key($key, 'HS256')); //HS256方式,这里要和签发的时候对应
			$arr            = (array)$decoded;
			$res['status']  = 200;
			$res['data']    =(array)$arr['data'];
			return $res;
		} catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
			$res['info']    = "签名不正确";
			return $res;
		}catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
			$res['info']    = "token失效";
			return $res;
		}catch(\Firebase\JWT\ExpiredException $e) { // token过期
			$res['info']    = "token失效";
			return $res;
		}catch(Exception $e) { //其他错误
			$res['info']    = "未知错误";
			return $res;
		}
	}

完成 这样在任何需要使用的地方世界输入 signToken(用户数据)直接就返回token了 解密也是同样的道理 另外其中上面几步中如果出现任何错误建议直接百度 php-jwt可能会因为版本不对不能使用百度下载其他版本的也一样逻辑步骤基本都一样

使用实例 这是tp6的中间件实际使用的代码

    /**
     * 处理请求
     *
     * @param \think\Request $request
     * @param \Closure       $next
     * @return Response|\think\response\Json
     */
    public function handle($request, \Closure $next) {
        $header = request()->header();
        // 验证token是否存在
        if (!isset($header['authorization']) || $header['authorization'] == null) {
            return json(['code'=>401,'msg'=>'Token失效请重新登录!!!']);
        }
        $info = checkToken($header['authorization']);
        if (!isset($info['status']) || $info['status'] != 200){
            return json(['code'=>401,'msg'=>'您未登录或者登录已过期,请重新登录!!!']);
        }
		$data = 查询数据库
		if ($data['onlyCode'] != $info['data']['onlyCode'] && $data['id'] != 1) {
			return json(['code'=>401,'msg'=>'您已在其他设备登录,请检查账号密码是否泄露!!!']);
		}
        return $next($request);
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值