您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

实例详解thinkphp6使用jwt认证

2025/1/8 17:11:03发布21次查看
本篇文章给大家带来了关于thinkphp的相关知识,其中主要介绍了使用jwt认证的问题,下面一起来看一下,希望对大家有帮助。
推荐学习:《php视频教程》
thinkphp6 使用jwt客户端使用用户名和密码请求登录服务端收到请求,验证用户名和密码验证成功后,服务端会签发一个token,再把这个token返回给客户端客户端收到token后可以把它存储起来,比如放到cookie中客户端每次向服务端请求资源时需要携带服务端签发的token,可以在cookie或者header中携带服务端收到请求,然后去验证客户端请求里面带着的token,如果验证成功,就向客户端返回请求数据安装 jwt 扩展composer require firebase/php-jwt
安装之后在 vender 目录下的 firebase 文件夹下
调用 jwt里面的 encode 和 decode方法进行生成token和验证token项目app 目录下的 common.php全局文件使用的 ,做成了公共方法,由于我是多应用的,所以就写在了api下面的common.php,大家可以根据自己需求适当调整
首先 引入 jwt ,然后写两个方法,生成验签和验证token。<?phpuse \firebase\jwt\jwt;use firebase\jwt\key;// 应用公共文件/** * 生成验签 * @param $uid 用户id * @return mixed */function signtoken($uid){ $key='abcdefg'; //自定义的一个随机字串用户于加密中常用的 盐 salt $token=array( "iss"=>$key,        //签发者 可以为空        aud=>'',          //面象的用户,可以为空        iat=>time(),      //签发时间        nbf=>time(),      //在什么时候jwt开始生效        exp=> time()+30,  //token 过期时间        data=>[           //记录的uid的信息            'uid'=>$uid,        ]    );    $jwt = jwt::encode($token, $key, hs256);  //生成了 token    return $jwt;}/** * 验证token * @param $token * @return array|int[] */function checktoken($token){    $key='abcdefg';     //自定义的一个随机字串用户于加密中常用的 盐  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;    }}
使用jwt生成token    /**     * 使用jwt生成token字符串     */    public function setjwttoken()    {        $uid = input('uid'); // 接收生成token字符串 如:123        $token = signtoken($uid);        // 生成字符串: eyj0exaioijkv1qilcjhbgcioijiuzi1nij9.eyjpc3mioijhymnkzwzniiwiyxvkijoiiiwiawf0ijoxnjqxnduwmtu0lcjuymyioje2nde0ntaxntcsimv4cci6mty0mtq1nzm1ncwizgf0ysi6eyj1awqioiixmjmifx0.i_gakmsohtepipkizcuqa-b9h6ovsovwx0awayi-b0s        echo $token;die;    }    /**     * 使用jwt验证token字符串     */    public function checkjwttoken()    {        $token  = input('token'); // 接收生成token字符串        $result = checktoken($token);        // array ( [status] => 200 [data] => array ( [uid] => 123 ) )        print_r($result);die;    }
创建 user 控制器<?phpdeclare (strict_types = 1);namespace app\api\controller;use think\facade\db;use think\request;class user{ public function login(request $request) { if ($request->ispost()){            $username = $request->param('username','','trim');            $password = $request->param('password','','trim');            //查询数据库            $user = db::name('user')->where('username',$username)->find();            if (!$user){                return json(['status' => 'fail','msg' => '用户名不存在']);            }            if ($user['password']!==md5($password)){                return json(['status' => 'fail','msg' => '密码错误']);            }            $gettoken = $this->token($user);            return json(['status' => 'success','msg' => '登陆成功','token' => $gettoken]);        }    }    public function token($user)    {        $uid = $user['username']; // 接收生成token字符串 如:123        $token = signtoken($uid);        dd($token);    }    /**     * 验证token     */    public function chtoken()    {        $token = 'eyj0exaioijkv1qilcjhbgcioijiuzi1nij9.eyjpc3mioijhymnkzwzniiwiyxvkijoiiiwiawf0ijoxnjq4mdkwmdkylcjuymyioje2ndgwotawotisimv4cci6mty0oda5mdeymiwizgf0ysi6eyj1awqioijcdtvmmjbcdtrlmdlcdtk4y2uifx0.ojfpncz6stmymocbd-mex0ipeiylyncwkxhmitf2cmw';        $result = checktoken($token);        // array ( [status] => 200 [data] => array ( [uid] => 123 ) )        print_r($result);die;    }}
用户登录成功返回给前端token,前端将token存储起来,在下次请求的时候头部携带着这个token,后端接受token,在中间件中进行验证
创建api中间件<?phpdeclare (strict_types = 1);namespace app\middleware;class api{ /** * 处理请求 * * @param \think\request $request * @param \closure $next * @return response */ public function handle($request, \closure $next) { //toke 合法性验证 $header = $request->header();        //判读请求头里有没有token        if(!isset($header['token'])){            return json(['code'=>440,'msg'=>'request must with token']);        }        $token = $header['token'];        try {            // token 合法            $token = checktoken($token);        }catch (\exception $e){            return json(['code'=>440,'msg'=>'invalid token']);        }        return $next($request);    }}
最后,关于如何处理token过期的问题,有两种解决办法,第一种就是,将token的时间设置长一些,这样token就不会过期,但是这样就有一个弊端,一旦客户端拿到了这个token就相当于有了密钥,主动权也就掌握在了用户的手上。所以不推荐这种方案。第二种就是,后端处理,当token过期的时候重新获取token,将新的token传给前端,前端在将新的token存储起来,替换掉原来的token,下一次请求的时候就携带着新的token请求。
我是程序员峰峰,一名爱学习,爱折腾的程序员。
推荐学习:《php视频教程》
以上就是实例详解thinkphp6使用jwt认证的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product