一、什么是 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