tp5 token 验证 jwt

本文详细介绍了PHP中使用JWT库创建和验证Token的过程。Token用于身份验证,包含多个自定义和预定义的声明,如签发时间、过期时间等。创建Token时,可以设置数据、过期时间和作用域。验证Token时,检查签名、过期时间等,确保安全性。此功能适用于API的身份验证。
摘要由CSDN通过智能技术生成

Token 类

<?php
/**
 * Created by .
 */
namespace app\index\controller;

class Token
{
    private $tokenKey = 'get_the_data';
 
    /**
     * @Notes:  创建token
     * @Interface createToken
     * @param string $data
     * @param string $exp_time
     * @param string $scopes
     * @return array
     */
    public function createToken($data="",$exp_time="",$scopes=""){
        //JWT标准规定的声明,但不是必须填写的;
        //iss: jwt签发者
        //sub: jwt所面向的用户
        //aud: 接收jwt的一方
        //exp: jwt的过期时间,过期时间必须要大于签发时间
        //nbf: 定义在什么时间之前,某个时间点后才能访问
        //iat: jwt的签发时间
        //jti: jwt的唯一身份标识,主要用来作为一次性token。
        //公用信息
        $return_data = [];
        try{
            $key = $this->tokenKey;
            $time = time();//当前时间
            //$token['iss']=''; //签发者 可选
            //$token['aud']=''; //接收该JWT的一方,可选
            $token['iat'] = $time; //签发时间
            $token['nbf'] = $time; //(Not Before):某个时间点后才能访问,比如设置time+30,表示当前时间30秒后才能使用
            if($scopes){
                $token['scopes'] = $scopes; //token标识,请求接口的token
            }
            if(!$exp_time){
                $exp_time = 7200;//默认=2小时过期
            }
            $token['exp'] = $time + $exp_time; //token过期时间,这里设置2个小时
            if($data){
                $token['data'] = $data; //自定义参数
            }
            $json = \Firebase\JWT\JWT::encode($token,$key);
            $return_data['status']="200";//
            $return_data['msg']='success';
            $return_data['token']= $json;//返回的数据
            return $return_data; //返回信息
 
        }catch (\Firebase\JWT\ExpiredException $exception){
            //签名不正确
            $return_data['status'] = "104";//101=签名不正确
            $return_data['msg'] = $exception->getMessage();
            $return_data['data'] = "";//返回的数据
            return $return_data; //返回信息
        }catch (\think\Exception $exception){
            //其他错误
            $return_data['status'] = "199";//199=签名不正确
            $return_data['msg'] = $exception->getMessage();
            $return_data['data'] = "";//返回的数据
            return $return_data; //返回信息
        }
    }
 
    /**
     * @Notes:  验证token是否有效,默认验证exp,nbf,iat时间
     * @Interface checkToken
     * @param $jwt
     * @return array
     */
    public function checkToken($jwt){
        $key = $this->tokenKey;
        $return_data = [];
        try {
            \Firebase\JWT\JWT::$leeway = 60;//当前时间减去60,把时间留点余地
            $decoded = \Firebase\JWT\JWT::decode($jwt, $key, ['HS256']); //HS256方式,这里要和签发的时候对应
            $arr = (array)$decoded;
            $return_data['status']="200";//200=成功
            $return_data['msg']="success";//
            $return_data['data']=$arr;//返回的数据
            return $return_data; //返回信息
        } catch(\Firebase\JWT\SignatureInvalidException $e) {
            //签名不正确
            $return_data['status']="101";//101=签名不正确
            $return_data['msg']=$e->getMessage();
            $return_data['data']="";//返回的数据
        }catch(\Firebase\JWT\BeforeValidException $e) {
            // 签名在某个时间点之后才能用
            $return_data['status']="102";
            $return_data['msg']=$e->getMessage();
            $return_data['data']="";//返回的数据
        }catch(\Firebase\JWT\ExpiredException $e) {
            // token过期
            $return_data['status']="103";//103=签名不正确
            $return_data['msg']=$e->getMessage();
            $return_data['data']="";//返回的数据
        }catch(\Exception $e) {
            //其他错误
            $return_data['status']="199";//199=签名不正确
            $return_data['msg']=$e->getMessage();
            $return_data['data']="";//返回的数据
        }
        return $return_data;
        //Firebase定义了多个 throw new,我们可以捕获多个catch来定义问题,catch加入自己的业务,比如token过期可以用当前Token刷新一个新Token
    }
 
}

2.jwt 模块,自己下载。放在extend 下,不然会出错的。

 3.基类使用

<?php

namespace app\index\controller;

use think\Controller;
use app\index\controller\Token;

class Base extends Controller
{
    //api 统一返回数据格式
    private  $utoken="";
    private  $user_id="";

    static public function showResCode($msg='', $data=[], $code=200){

        $res = [
            'msg'=>$msg ? $msg : '未定义消息',
            'data'=>$data ? $data : []
        ];
        return json([$res,$code]);
    }

    static public function showResCodeWithOutData($msg='',$code=200){
        return self::showResCode($msg,[],$code);
    }



    protected function createToken($user_info)
    {
        $objToken = new Token();
        $token_data = [
            'user_id'   =>  $user_info['acode'],
        ];
        $token_res = $objToken->createToken($token_data);
        if($token_res['status'] == '200'){
            $user_info['token'] = $token_res['token'];
            return $user_info;
        }
    }

    protected function checkUToken(){
        $jw_token = new Token();
        $header = \request()->header();
        if(array_key_exists('token',$header)){
            $this->utoken = $header['token'];
        }
        if($this->utoken){
            $jwt_check_res = $jw_token->checkToken($this->utoken);
            if($jwt_check_res['status'] == 200){
                $data = $jwt_check_res['data'];
                $this->user_id = $data['data']->user_id;
                return true;
            }
        }
        $this->error("请勿非法进入");
    }

    

}

3.前端uview 处理

config.header.token = uni.getStoreSync("token")

4.使用

 //销售单列表
    public function xsbillddList()
    {
        $this->checkUToken();
        $param = request()->param();
        $keyWord = $param['keyWord'];
        $pageSize = $param['pageSize'];
        $pageIndex = $param['pageIndex'];

        $pageSize = $pageSize ? $pageSize : 20;
        $pageIndex = $pageIndex ? $pageIndex : 1;
        
        $sqlwhere = " where  isnull(status,0)&2>=2 and  (khaname_long like '%".$keyWord."%' or acode like '%".$keyWord."%' or khname like '%".$keyWord."%') ";
        $sql =  "select  * , (select COUNT(*)  from vxsbilldd_m ".$sqlwhere." ) as guid_count ".
                "from ( select cast( ROW_NUMBER() over (order by date_yw Desc ) as int) guid_row,* ".
                "         from vxsbilldd_m ".$sqlwhere." ) a  where guid_row>".($pageSize*($pageIndex-1))." and guid_row<=".($pageSize*$pageIndex);

        $res = Db::query($sql);
        return self::showResCode('操作成功',$res);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Listest

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值