美文网首页
JWT通过user_token解析

JWT通过user_token解析

作者: Stonesy | 来源:发表于2023-03-22 09:29 被阅读0次

    一、登录流程?

    前端发送请求 -> 后端验证通过后签发 Token -> 前端存入token,在请求其他接口是将token带入header头中

    二、使用步骤

    1.引入 jwt 库

    安装:

    composer require firebase/php-jwt
    

    依赖composer,通过 cmd 进入项目根目录 或者 项目终端 安装:

    检查项目vendor文件中生成了以下文件就代表安装成功

    45adac3656a54250b58c9922507af22d.png

    引入:

    use Firebase\JWT\JWT;       
    

    2.生成 token
    代码:

        public function loginpwd($username, $password)
        {
            $password = md5($password);
            $loginpwd = new user();
            $checkuser = $loginpwd->checkuser($username, $password);
            if ($checkuser['code'] == 0) { 
                return json($checkuser);
            } else if ($checkuser['code'] == 1) { 
                $key = 'adminTokenpwd';
                $token = array(
                    "iat" => time(),
                    "nbf" => time(),
                    "exp" => time() + 60 * 60 * 24 * 7,
                    "uid" => $checkuser['id']
                );
                $jwt = JWT::encode($token, $key, "HS256");
                return json(['code' => 1, 'msg' => '登陆成功', 'token' => $jwt]);
            } else { 
                return json($checkuser);
            }
        }
    

    核心:

                   $key = 'adminTokenpwd';                 //自定义key,必须与验证token中的key一致
     
                   $token = array(
     
                   "iat" => time(),                    // jwt的签发时间
     
                   "nbf" => time(),                    //定义在某个时间前 jwt 是不可用的
     
                   "exp" => time() + 60 * 60 * 24 * 7,   // jwt 的过期时间(大于签发时间),规则:秒*分*时*天
     
                   "uid" => $checkuser['id']           // 自定义的数据:这里我带了用户id
     
                );
     
                   $jwt = JWT::encode($token, $key, "HS256");      //调用方法
     
    

    返回数据格式:

    877664ec9c9f4af4afbe17a9661563ef.png

    3.解密 token
    我是在控制器中单独创建的一个Token文件,也可以放在中间件。

    这里我继承的BaseController ,其他接口文件直接继承Token

    引入:

    use Exception;
    use Throwable;
    use Firebase\JWT\JWT;
    use app\BaseController;
    use Firebase\JWT\ExpiredException;
    use Firebase\JWT\BeforeValidException;
    use Firebase\JWT\SignatureInvalidException;
    

    验证方法:

    ``PHP
    class Token extends BaseController
    {
    /**
    * Token验证
    */
    // 验证 token
    protected function initialize()
    {
    parent::initialize();
    header = request()->header(); if (!isset(header['token']) || header['token'] == null) { echo json(['code' => 0, 'msg' => 'token不能为空'], 400)->send(); die(); }token = $header['token'];

        $key = 'adminTokenpwd'; // 解密token,key必须与签发token中的key一致
        try {
            $info = JWT::decode($token, $key, ['HS256']);
            $this->uid = $info->uid;
        } catch (SignatureInvalidException $e) { //签名不正确
            echo json(['code' => 0, 'status' => $e->getCode(), 'msg' => '签名不正确'], 400)->send();
            die();
        } catch (BeforeValidException $e) { // 签名在某个时间点之后才能用
            echo json(['code' => 1, 'status' => $e->getCode(), 'msg' => '账号未到可用时间'], 400)->send();
            die();
        } catch (ExpiredException $e) { // token过期
            echo json(['code' => 2, 'status' => $e->getCode(), 'msg' => '登录状态过期'], 400)->send();
            die();
        } catch (Exception $e) { //其他错误
            echo json(['code' => 3, 'status' => $e->getCode(), 'msg' => '非法操作'], 400)->send();
            die();
        } catch (Throwable $e) {
            echo json(['code' => 3, 'status' => $e->getCode(), 'msg' => '非法操作'], 400)->send();
            die();
        }
    }
    

    }

    
    

    相关文章

      网友评论

          本文标题:JWT通过user_token解析

          本文链接:https://www.haomeiwen.com/subject/xtvvrdtx.html