文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

thinkphp6中怎么使用jwt认证

2023-07-02 12:58

关注

本篇内容主要讲解“thinkphp6中怎么使用jwt认证”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“thinkphp6中怎么使用jwt认证”吧!

thinkphp6 使用jwt

  1. 客户端使用用户名和密码请求登录

  2. 服务端收到请求,验证用户名和密码

  3. 验证成功后,服务端会签发一个token,再把这个token返回给客户端

  4. 客户端收到token后可以把它存储起来,比如放到cookie中

  5. 客户端每次向服务端请求资源时需要携带服务端签发的token,可以在cookie或者header中携带

  6. 服务端收到请求,然后去验证客户端请求里面带着的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;// 应用公共文件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;}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

        public function setJwtToken()    {        $uid = input('uid'); // 接收生成token字符串 如:123        $token = signToken($uid);        // 生成字符串: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhYmNkZWZnIiwiYXVkIjoiIiwiaWF0IjoxNjQxNDUwMTU0LCJuYmYiOjE2NDE0NTAxNTcsImV4cCI6MTY0MTQ1NzM1NCwiZGF0YSI6eyJ1aWQiOiIxMjMifX0.I_GAkMsOhtEpIPkizCuQA-b9H6ovSovWx0AwAYI-b0s        echo $token;die;    }        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);    }        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{        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);    }}

到此,相信大家对“thinkphp6中怎么使用jwt认证”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯