iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >ThinkPHP 集成 jwt 技术 token 验证
  • 187
分享到

ThinkPHP 集成 jwt 技术 token 验证

ThiinkPHPPHP 2023-09-08 12:09:46 187人浏览 独家记忆
摘要

ThinkPHP 集成 Jwt 技术 token 验证 一、思路流程二、安装 firebase/php-jwt三、封装token类四、创建中间件,检验Token校验时效性五、配置路由中间件六、

ThinkPHP 集成 Jwt 技术 token 验证

一、思路流程

  1. 客户端使用用户名和密码请求登录
  2. 服务端收到请求,验证用户名和密码
  3. 验证成功后,服务端会签发一个token,再把这个token返回给客户端
  4. 客户端收到token后可以把它存储起来,比如放到cookie中
  5. 客户端每次向服务端请求资源时需要携带服务端签发的token,可以在cookie或者header中携带
  6. 服务端收到请求,然后去验证客户端请求里面带着的token,如果验证成功,就向客户端返回请求数据

二、安装 firebase/php-jwt

composer require firebase/php-jwt

三、封装token类

因为我这个是多应用,然后我就只在index应用(只提供api接口)下设置了token类

在这里插入图片描述

<?phpnamespace app\index\server;use Firebase\JWT\JWT;use Firebase\JWT\Key;class Token{    protected $key;    public function __construct()    {        //从配置信息这种或取唯一字符串,你可以随便写比如md5('token')        $this->key = 'adcdefg';    }        function generateToken($uid)    {        //获取当前时间戳        $currentTime = time();        $data = array(            "iss" => $this->key,        //签发者 可以为空            "aud" => '',             //面象的用户,可以为空            "iat" => $currentTime,   //签发时间            "nbf" => $currentTime,   //立马生效            "exp" => $currentTime + 7200, //token 过期时间 两小时            "data" => [              //记录的userid的信息,这里是自已添加上去的,如果有其它信息,可以再添加数组的键值对                'uid' => $uid,            ]        );        //生成token        $token = JWT::encode($data, $this->key, "HS256");  //根据参数生成了 token        return $token;    }        public function chekToken($token)    {        $status=array("code"=>2);        try {            JWT::$leeway = 60;//当前时间减去60,把时间留点余地            $decoded = JWT::decode($token,new Key($this->key,'HS256')); //HS256方式,这里要和签发的时候对应            $arr = (array)$decoded;            $res['code']=1;            $res['data']=$arr['data'];            return $res;        } catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确            $status['msg']="签名不正确";            return $status;        }catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用            $status['msg']="token失效";            return $status;        }catch(\Firebase\JWT\ExpiredException $e) { // token过期            $status['msg']="token失效";            return $status;        }catch(\Exception $e) { //其他错误            $status['msg']="未知错误";            return $status;        }    }}

四、创建中间件,检验Token校验时效性

创建中间件命令:

php think make:middleware CheckToken

在这里插入图片描述

declare (strict_types = 1);namespace app\middleware;class CheckToken{    public function handle($request, \Closure $next)  {    //第一步先取token    $token = $request->header('token');    //jwt进行校验token    $res = (new TokenServer())->chekToken($token);    if ($res['code'] != 1 ){      return JSON(['error_code'=>999,'msg'=>$res['msg'],'data'=>''],400);    }    $request->uid = $res['data']->uid;    return $next($request);  }}

五、配置路由中间件

在config/middleware.php中注册中间件

在这里插入图片描述

// 中间件配置return [    // 别名或分组    'alias'    => [        // 注册中间件        'check' => [            app\middleware\CheckToken::class        ],    ],    // 优先级设置,此数组中的中间件会按照数组中的顺序优先执行    'priority' => [],];

在app/api/route/route.php路由文件中进行使用,进行使用中间件校验token

在这里插入图片描述

use think\facade\Route;// restfull 资源路由Route::resource('a', 'TestR');// 路由分组Route::group('a',function (){})->middleware('check');

六、写几个测试方法,通过postman去验证

declare (strict_types = 1);namespace app\index\controller;use app\index\server\Token as TokenServer;use think\Request;use think\annotation\route\Resource;// 资源控制器class TestR{        public function index(Request $request)    {        // 假定用户名为robin和密码为123456即为正确的账号        if($request->param('uname') == 'robin'&& $request->param('upwd')=='123456')        {            $uid = $request->param('uname');            // 设置token            $token = (new TokenServer())->generateToken($uid);            $data = ['name' => 'thinkphp', 'status' => '1','token'=>$token];            // 给前端返回json字符串,同时前端将token获取并且存入到以后的所有操作中            return show(config("status.success"),"请求成功",$data);        }else{            return show(config("status.error"),"用户名密码错误",null);        }    }        public function save(Request $request)    {        // 用update 来验证一下token        $token = $request->param('token');        $rs = checkToken($token);        return json($rs);    }  // ....}
  1. 模拟登录测试

在这里插入图片描述

  1. 模拟前端携带token参数访问
    在这里插入图片描述

来源地址:https://blog.csdn.net/m0_63622279/article/details/132575734

--结束END--

本文标题: ThinkPHP 集成 jwt 技术 token 验证

本文链接: https://www.lsjlt.com/news/399921.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作