• 在 ThinkPHP 中使用 JWT 签发 Token


    一、什么是 JWT

    JWT,全称:Json Web Token,可以看成是一种 Token 签发方案。

    Token 通常叫做认证令牌,用于客户端和服务端在交互时的身份认证。

    JWT 的优势:

    1. 数据量小,传输速度快。
    2. 使用 json 数据格式,可跨语言。
    3. 即签即发,不需要在服务端保存。
    4. 适合移动端。

    更多关于 JWT 的信息可访问官网查看 >>>

    二、在 ThinkPHP 中安装 JWT

    先去官网挑选适合自己项目的库。

    进入官网,选择 Libraries ,选择 PHP 语言过滤。

    在这里插入图片描述

    每个库都有对应的 composer 命令。

    这里选择第一个,在 ThinkPHP 项目根目录下执行命令安装:

    composer require firebase/php-jwt
    
    • 1

    三、签发 Token 示例

    public function createToken()
    {
        $jwtContent = [
        	// 签发人,这里采用当前站点域名
            'iss' => request()->domain(),
            // 签发时间,当前时间戳
            'iat' => time(),
            // 到期时间,1天后
            'exp' => time() + 86400,
            // 自定义数据
            'data' => [
                'user_id' => 1,
                'user_name' => 'jack'
            ]
        ];
        // 自定义 key,用于加密 token,只保存在服务端,不可泄漏。
        $key = 'iwsojfiowejgiroegnioamr';
        // 使用 HS256 算法,生成 token 。
        $token = JWT::encode($jwtContent, $key, 'HS256');
        // 打印输出
        halt($token);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    结果示例:

    eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vd3d3LnRwNS5jb20iLCJpYXQiOjE2Njc3ODk2MDEsImV4cCI6MTY2Nzc4OTYyMSwiZGF0YSI6eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6MTIzfX0.JWBTMvl_6vv3SBCm5moM6BzYqvb8Kr7PQ6VnTL66HLc
    
    • 1

    生成 tokenJWT 提供了以下字段可以选择:

    iss:发行者
    exp:到期时间
    sub:主题
    aud:用户
    nbf:生效时间
    iat:发布时间
    jti:JWTID,用于标识该JWT
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    四、使用 Token 示例

    public function checkToken()
    {
        try {
        	// 此 key 必须和生成 token 时的一致。
            $key = 'iwsojfiowejgiroegnioamr';
            // 接收客户端提交的 token 。
            $token = input('token/s');
            $test = JWT::decode($token, new Key($key, 'HS256'));
            halt((array)$test);
        } catch (SignatureInvalidException $signatureInvalidException) {
        	// 获取验证失败时抛出的错误信息
        	halt($signatureInvalidException->getMessage());
        } catch (ExpiredException $expiredException) {
        	// 获取 token 过期时抛出的错误信息
        	halt($expiredException->getMessage());
        } catch (Exception $exception) {
        	// 获取抛出的其它错误信息
        	halt($exception->getMessage());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    解析 token 成功示例:

    array(4) {
      ["iss"] => string(18) "http://www.tp5.com"
      ["iat"] => int(1667802222)
      ["exp"] => int(1667888622)
      ["data"] => object(stdClass)#13 (2) {
        ["user_id"] => int(1)
        ["username"] => string(4) "jack"
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    解析 token 失败示例:

    Signature verification failed
    
    • 1

    解析 token 过期示例:

    Expired token
    
    • 1
  • 相关阅读:
    身份证照片怎么弄成200k以内?三个方法轻松搞定!
    工业机器人复习重点
    人类真的与恐龙无缘见面吗?看看雕刻和绘画怎样说
    【软件测试】性能测试初相识
    怎么获取开源的商城源码
    《统计学习方法》 第十一章 条件随机场(原理+代码)
    Java基础学习笔记(五)—— 面向对象编程(2)
    4.2.2 设置VMware虚拟机
    数电笔记总结(二)(逻辑代数基础)
    redis的下载和安装详解
  • 原文地址:https://blog.csdn.net/ZhangJiWei_2019/article/details/127728267