本文目录
一、什么是 JWT
JWT
,全称:Json Web Token
,可以看成是一种 Token
签发方案。
Token
通常叫做认证令牌,用于客户端和服务端在交互时的身份认证。
JWT
的优势:
- 数据量小,传输速度快。
- 使用
json
数据格式,可跨语言。 - 即签即发,不需要在服务端保存。
- 适合移动端。
二、在 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
生成 token
时JWT
提供了以下字段可以选择:
iss:发行者exp:到期时间sub:主题aud:用户nbf:生效时间iat:发布时间jti:JWT的ID,用于标识该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
来源地址:https://blog.csdn.net/ZhangJiWei_2019/article/details/127728267