首页 > 编程语言 >thinkphp6中jwt的使用

thinkphp6中jwt的使用

时间:2024-03-23 17:57:32浏览次数:30  
标签:function return jwt param thinkphp6 token 使用 id think

thinkphp6中jwt的使用

  1. 安装JWT插件

    composer require firebase/php-jwt
    
  2. 创建User模型

    php think make:model User
    
  3. 创建User控制器

    php think make:controller User
    
  4. 封装创建token函数,要在User模型中创建

     // 加密的秘钥
    protected $key = "test";
    // 过期时间
    protected $exptime = 60*60*24; // 一天
    function createToken($user)
        {
            // jwt的签发秘钥
            $key = md5($this->key);
            // 签发时间
            $time = time();
            // 过期时间
            $expire = $time + $this->exptime;
            $token = [
                "user"       =>      $user,
                "iat"       =>      $time,
                "nbf"       =>      $time,
                "exp"       =>      $expire
            ];
            $jwt = JWT::encode($token,$key,'HS256');
            return $jwt;
        }
    
  5. 封装验证token函数,要在User模型中创建

     // 加密的秘钥
    protected $key = "test";
     // 过期时间
    protected $exptime = 60*60*24; // 一天  
    function verifyToken($token)
        {
            $key = md5($this->key);
            $headers = ['HS256'];
            try {
                $jwtAuth = json_encode(JWT::decode($token, $key, $headers));
                 if ($jwtAuth->exp < time()) {
                      throw new ExpiredException();
                  }
                return [
                    "code"  =>  1,
                    "msg"   =>  "通过",
                    "data"  =>  $jwtAuth[0]
                ];
            }catch (ExpiredException $e) {
                return [
                    "code"  =>  0,
                    "msg"   =>  "token已过期"
                ];
            }
            catch (\Exception $e) {
                return [
                    "code"  =>  0,
                    "msg"   =>  "token无效"
                ];
            }
        }
    
  6. 在User控制器中使用

    <?php
    declare (strict_types = 1);
    
    namespace app\controller;
    
    use app\BaseController;
    use app\middleware\Auth;
    use think\Db;
    use think\Request;
    
    class Users extends  BaseController
    {
        protected $nologin = ["login"];
        /**
         * 显示资源列表
         *
         * @return \think\Response
         */
        public function index()
        {
            //
        }
    
        public function login()
        {
            // 登录成功
            // 模拟用户信息
            $user = [
                "id"    =>  1,
                "username"  =>  "text"
            ];
            return json([
                "msg"   =>  "登录成功",
                "data"  => (new \app\model\Users())->createToken($user)
            ]);
    
        }
        /**
         * 保存新建的资源
         *
         * @param  \think\Request  $request
         * @return \think\Response
         */
        public function save(Request $request)
        {
            //
        }
    
        /**
         * 显示指定的资源
         *
         * @param  int  $id
         * @return \think\Response
         */
        public function read($id)
        {
            //
        }
    
        /**
         * 保存更新的资源
         *
         * @param  \think\Request  $request
         * @param  int  $id
         * @return \think\Response
         */
        public function update(Request $request, $id)
        {
            //
        }
    
        /**
         * 删除指定资源
         *
         * @param  int  $id
         * @return \think\Response
         */
        public function delete($id)
        {
            //
        }
    }
    
    
  7. 创建中间件来进行校验token

    1. 创建中间件
    php think make:middleware Auth
    
    1. 编写校验代码
    <?php
    declare (strict_types = 1);
    
    namespace app\middleware;
    
    class Auth
    {
        /**
         * 处理请求
         *
         * @param \think\Request $request
         * @param \Closure       $next
         * @return Response
         */
        public function handle($request, \Closure $next)
        {
            $token = $request->header('token','');
            if(empty($token)){
                return json([
                    "code"  =>  0,
                    "msg"   =>  "token不能为空"
                ]);
            }
            $res = (new \app\model\Users())->verifyToken($token);
            if($res['code'] == 0){
                return json([
                    "code"  =>  0,
                    "msg"   =>  $res['msg']
                ]);
            }else{
                $request->user = $res['data'];
                return $next($request);
            }
        }
    }
    
    
  8. 在基础控制器中使用中间件BaseController.php

    <?php
    declare (strict_types = 1);
    
    namespace app;
    
    use app\middleware\Auth;
    use think\App;
    use think\exception\ValidateException;
    use think\Validate;
    
    /**
     * 控制器基础类
     */
    abstract class BaseController
    {
        /**
         * Request实例
         * @var \think\Request
         */
        protected $request;
    
        /**
         * 应用实例
         * @var \think\App
         */
        protected $app;
    
        /**
         *
         * 是否批量验证
         * @var bool
         */
        protected $batchValidate = false;
    
        /**
         * 控制器中间件
         * @var array
         */
        protected $middleware = [];
        /**
         * 配置控制器不需要检验token的方法
         * @var array
         */
        protected $nologin = [];
    
    
    
        /**
         * 构造方法
         * @access public
         * @param  App  $app  应用对象
         */
        public function __construct(App $app)
        {
            $this->app     = $app;
            $this->request = $this->app->request;
            // 配置中间件
            $this->middleware = [
                Auth::class     =>      ['except' => $this->nologin]
            ];
            // 控制器初始化
            $this->initialize();
        }
    
        // 初始化
        protected function initialize()
        {}
    
        /**
         * 验证数据
         * @access protected
         * @param  array        $data     数据
         * @param  string|array $validate 验证器名或者验证规则数组
         * @param  array        $message  提示信息
         * @param  bool         $batch    是否批量验证
         * @return array|string|true
         * @throws ValidateException
         */
        protected function validate(array $data, $validate, array $message = [], bool $batch = false)
        {
            if (is_array($validate)) {
                $v = new Validate();
                $v->rule($validate);
            } else {
                if (strpos($validate, '.')) {
                    // 支持场景
                    [$validate, $scene] = explode('.', $validate);
                }
                $class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate);
                $v     = new $class();
                if (!empty($scene)) {
                    $v->scene($scene);
                }
            }
    
            $v->message($message);
    
            // 是否批量验证
            if ($batch || $this->batchValidate) {
                $v->batch(true);
            }
    
            return $v->failException(true)->check($data);
        }
    
    }
    
    
  9. 在控制器中使用

    <?php
    declare (strict_types = 1);
    
    namespace app\controller;
    
    use app\BaseController;
    use think\Request;
    
    // 继承基础控制器
    class Users extends  BaseController
    {
        // 配置登录接口不用校验token
        protected $nologin = ["login"];
        /**
         * 显示资源列表
         *
         * @return \think\Response
         */
        public function index()
        {
            echo 22;
        }
    
        public function login()
        {
            // 登录成功
            // 模拟用户信息
            $user = [
                "id"    =>  1,
                "username"  =>  "text"
            ];
            return json([
                "msg"   =>  "登录成功",
                "data"  => (new \app\model\Users())->createToken($user)
            ]);
    
        }
        /**
         * 保存新建的资源
         *
         * @param  \think\Request  $request
         * @return \think\Response
         */
        public function save(Request $request)
        {
            //
        }
    
        /**
         * 显示指定的资源
         *
         * @param  int  $id
         * @return \think\Response
         */
        public function read($id)
        {
            //
        }
    
        /**
         * 保存更新的资源
         *
         * @param  \think\Request  $request
         * @param  int  $id
         * @return \think\Response
         */
        public function update(Request $request, $id)
        {
            //
        }
    
        /**
         * 删除指定资源
         *
         * @param  int  $id
         * @return \think\Response
         */
        public function delete($id)
        {
            //
        }
    }
    

标签:function,return,jwt,param,thinkphp6,token,使用,id,think
From: https://www.cnblogs.com/00544--/p/18091400

相关文章

  • 使用Log4j2输出日志演示
    pom.xml引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><!--去掉SpringBoot默认日志配置-->......
  • Collections工具类,可以使用collections工具类对代码中的list进行分组
    /***根据活动id进行分组*key活动id*value活动id对应的商品id*/Map<Long,Set<Long>>collect=activitySkuList.stream().collect(Collectors.groupingBy(ActivitySku::getActivityId......
  • WinAppSDK / WinUI3 项目无法使用 SystemEvents 的问题
    SystemEvents是一个开发win32窗口项目很常用的类,其中封装了一些常用的系统广播消息。在WinUI3项目中,SystemEvents事件经常无法触发,简单排查了一下原因。SystemEvent内封装了一个线程和一个窗口,通过窗口消息在内部线程上调用事件,内部使用了SystemEventInvokeInfo对象来保......
  • 使用pdf.js渲染pdf文件,并修改iframe的样式
    <template><divv-loading="loading"><iframe:src="pdfUrl":style="styles"style="border:none;width:100%"@load="setPdfStyle"//load事件是在ifram完全加载完后的时期执行的函数r......
  • 为什么DNS使用UDP(端口号是53)而不是TCP
    DNS(DomainNameSystem)使用UDP(UserDatagramProtocol)而不是TCP(TransmissionControlProtocol)的主要原因是出于性能和效率的考虑。下面详细解释为什么DNS选择使用UDP协议:小型请求和快速响应:DNS查询通常是小型请求,仅需要几个字节的数据传输。UDP是无连接的协议,它不需要在通信之......
  • Python面向对象(一):类的概念和使用
    目录何为类创建类为类创造一个实例内部访问内部隐藏何为类类,顾名思义就是一种数据类型,具有自己的属性和方法。类是一种对象的集合,所以对象也是类的实例。这么说可能很抽象且难以理解,在这里我们暂时将类理解为一种类型。举一个比较具体的例子,人就可以是一个类。正常的......
  • mongoDB使用记录:副本集选举淘汰策略失效
    一个问题场景:业务请求查询数据库,当请求没有成功返回时(这里是数据库机器异常,表现是不返回请求结果,处于假死状态),业务挂起进入等待(WAIT),逻辑中断,表现为卡顿、持续加载中;高并发场景下,短时间内堆积的请求会大量占用发起数据库请求的机器的内存(风险一),大量业务卡顿异常;当数据库异常解决成......
  • mongoDB使用记录:误用数组索引
    版本:mongoDB4.2集群方案:副本+分片一个问题场景:集合内对多个字段建立索引,其中包含数组索引;当执行查询时,业务查询期望命中数组索引,mongodb筛选策略首次给出的执行方案命中了另外的索引key,导致当次慢查询,扫描超过1000w数量的文档,业务出现卡顿;处理&优化方案:mongodb筛选策略命中......
  • 【Java - 框架 - HttpClient】(01) 使用“HttpClient“爬取网页的代码示例 - 快速上手
    使用"HttpClient"爬取网页的代码示例-快速上手;依赖<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpcore</artifactId><version>4.4.14</version></dependency><dependency>......
  • 使用Django-Simple-Captcha在Django项目加入验证码模块并自定义样式
    在Django项目中加入验证码功能,通常需要借助第三方库,比如Django-Smple-Captch、Django-reCAPTCHA、DEF-reCAPTCHA、Wagtail-Django-ReCaptcha、Django-Friendly-Captcha等。其中,Django-Smple-Captcha是一个流行的选择,它提供了一个简单而强大的Django应用,无需调用第三方API,......