在 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

三、签发 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);
}

结果示例:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vd3d3LnRwNS5jb20iLCJpYXQiOjE2Njc3ODk2MDEsImV4cCI6MTY2Nzc4OTYyMSwiZGF0YSI6eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6MTIzfX0.JWBTMvl_6vv3SBCm5moM6BzYqvb8Kr7PQ6VnTL66HLc

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

iss:发行者
exp:到期时间
sub:主题
aud:用户
nbf:生效时间
iat:发布时间
jti:JWTID,用于标识该JWT

四、使用 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());
    }
}

解析 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"
  }
}

解析 token 失败示例:

Signature verification failed

解析 token 过期示例:

Expired token
  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

相逢不晚何必匆匆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值