🔑 JWT 认证插件
简介
Json web token 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519)。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。
安装
composer require tinywan/jwt 生成令牌
$user = [ 'id' => 2022, // 这里必须是一个全局抽象唯一id 'name' => 'Tinywan', 'email' => 'Tinywan@163.com' ]; $token = Tinywan\Jwt\JwtToken::generateToken($user); var_dump(json_encode($token)); 输出(json格式)
{ "token_type": "Bearer", "expires_in": 36000, "access_token": "eyJ0eXAiOiJAUR-Gqtnk9LUPO8IDrLK7tjCwQZ7CI...", "refresh_token": "eyJ0eXAiOiJIEGkKprvcccccQvsTJaOyNy8yweZc..." } 参数描述
| 参数 | 类型 | 描述 | 示例值 |
|---|---|---|---|
| token_type | string | Token 类型 | Bearer |
| expires_in | int | 凭证有效时间,单位:秒 | 36000 |
| access_token | string | 访问凭证 | XXXXXXXXXXXXXXXXXXXX |
| refresh_token | string | 刷新凭证(访问凭证过期使用 ) | XXXXXXXXXXXXXXXXXXXX |
已支持方法
1、获取当前
uid
Tinywan\Jwt\JwtToken::getCurrentId(); 2、获取所有扩展字段
Tinywan\Jwt\JwtToken::getExtend(); 3、获取自定义字段
Tinywan\Jwt\JwtToken::getExtendVal('email'); 4、刷新令牌(通过刷新令牌获取访问令牌)
Tinywan\Jwt\JwtToken::refreshToken(); 5、获取令牌有效期剩余时长(单位:秒)
Tinywan\Jwt\JwtToken::getTokenExp(); 6、单设备登录。默认是关闭,开启请修改配置文件
config/plugin/tinywan/jwt
'is_single_device' => true, 7、获取当前用户信息(模型)。需要插件大于版本
>=1.2.4
Tinywan\Jwt\JwtToken::getUser(); 注意:该配置项目
'user_model'为一个匿名函数,匿名函数参数$uid为当前登录用户id,默认返回空数组,可以根据自己项目ORM定制化自己的返回模型
ThinkORM 配置
'user_model' => function($uid) { // 返回一个数组 return \think\facade\Db::table('resty_user') ->field('id,username,create_time') ->where('id',$uid) ->find(); } LaravelORM 配置
'user_model' => function($uid) { // 返回一个对象 return \support\Db::table('resty_user') ->where('id', $uid) ->select('id','email','mobile','create_time') ->first(); } 8、令牌清理
Tinywan\Jwt\JwtToken::clear(); 注:只有配置项 is_single_device为true 才会生效
9、自定义终端
client。需要插件大于版本>=v1.8.2
// 生成WEB令牌 $user = [ 'id' => 2022, 'name' => 'Tinywan', 'client' => JwtToken::TOKEN_CLIENT_WEB ]; $token = JwtToken::generateToken($user); // 生成移动端令牌 $user = [ 'id' => 2022, 'name' => 'Tinywan', 'client' => JwtToken::TOKEN_CLIENT_MOBILE ]; $token = JwtToken::generateToken($user); 默认是WEB端
- 自定义访问令牌和刷新令牌过期时间
$extend = [ 'id' => 2024, 'name' => 'Tinywan', 'access_exp' => 600, // 10 分钟 'refresh_exp' => 7200, // 2 小时 ]; $token = Tinywan\Jwt\JwtToken::generateToken($extend); 11、支持
GET方式获取令牌。需要插件大于版本>=1.9.0
/** 是否支持 get 请求获取令牌 */ 'is_support_get_token' => true, /** GET 请求获取令牌请求key */ 'is_support_get_token_key' => 'authorization', 12、自定义访问令牌和刷新令牌过期时间
$extend = [ 'id' => 2024, 'access_exp' => 7200, // 2 小时 ]; $token = Tinywan\Jwt\JwtToken::generateToken($extend); 13、各个算法的最小长度要求(
HS*系列最常见)。插件大于版本>=1.4.0强制要求
| 算法 | 最低密钥长度(字节) | 字符数参考(UTF-8) | 推荐生成方式 |
|---|---|---|---|
| HS256 | 32 字节 | ≥32 字符 | bin2hex(random_bytes(32)) → 64 hex 字符 |
| HS384 | 48 字节 | ≥48 字符 | random_bytes(48) |
| HS512 | 64 字节 | ≥64 字符 | random_bytes(64) |
14、令牌过期错误码
- 访问令牌
- 身份验证令牌无效:
401011 - 身份验证令牌尚未生效:
401012 - 身份验证会话已过期,请重新登录!:
401013 - 获取的扩展字段不存在:
401014 - 访问令牌未知错误:
401015
- 身份验证令牌无效:
- 刷新令牌
- 刷新令牌无效:
401021 - 刷新令牌尚未生效:
401022 - 刷新令牌会话已过期,请再次登录!:
401023 - 刷新令牌获取的扩展字段不存在:
401024 - 刷新令牌未知错误:
401025
- 刷新令牌无效:
签名算法
JWT 最常见的几种签名算法(JWA):HS256(HMAC-SHA256) 、RS256(RSA-SHA256) 还有 ES256(ECDSA-SHA256)
JWT 算法列表如下
+--------------+-------------------------------+--------------------+ | "alg" Param | Digital Signature or MAC | Implementation | | Value | Algorithm | Requirements | +--------------+-------------------------------+--------------------+ | HS256 | HMAC using SHA-256 | Required | | HS384 | HMAC using SHA-384 | Optional | | HS512 | HMAC using SHA-512 | Optional | | RS256 | RSASSA-PKCS1-v1_5 using | Recommended | | | SHA-256 | | | RS384 | RSASSA-PKCS1-v1_5 using | Optional | | | SHA-384 | | | RS512 | RSASSA-PKCS1-v1_5 using | Optional | | | SHA-512 | | | ES256 | ECDSA using P-256 and SHA-256 | Recommended+ | | ES384 | ECDSA using P-384 and SHA-384 | Optional | | ES512 | ECDSA using P-521 and SHA-512 | Optional | | PS256 | RSASSA-PSS using SHA-256 and | Optional | | | MGF1 with SHA-256 | | | PS384 | RSASSA-PSS using SHA-384 and | Optional | | | MGF1 with SHA-384 | | | PS512 | RSASSA-PSS using SHA-512 and | Optional | | | MGF1 with SHA-512 | | | none | No digital signature or MAC | Optional | | | performed | | +--------------+-------------------------------+--------------------+ The use of "+" in the Implementation Requirements column indicates that the requirement strength is likely to be increased in a future version of the specification. 可以看到被标记为 Recommended 的只有 RS256 和 ES256。
对称加密算法
插件安装默认使用
HS256对称加密算法。
HS256 使用同一个「secret_key」进行签名与验证。一旦 secret_key泄漏,就毫无安全性可言了。因此 HS256 只适合集中式认证,签名和验证都必须由可信方进行。
非对称加密算法
RS256 系列是使用 RSA 私钥进行签名,使用 RSA 公钥进行验证。
公钥即使泄漏也毫无影响,只要确保私钥安全就行。RS256 可以将验证委托给其他应用,只要将公钥给他们就行。
以下为RS系列算法生成命令,仅供参考
RS512
ssh-keygen -t rsa -b 4096 -E SHA512 -m PEM -P "" -f RS512.key openssl rsa -in RS512.key -pubout -outform PEM -out RS512.key.pub RS512
ssh-keygen -t rsa -b 4096 -E SHA354 -m PEM -P "" -f RS384.key openssl rsa -in RS384.key -pubout -outform PEM -out RS384.key.pub RS256
ssh-keygen -t rsa -b 4096 -E SHA256 -m PEM -P "" -f RS256.key openssl rsa -in RS256.key -pubout -outform PEM -out RS256.key.pub 具体算法配置请参考
config/plugin/tinywan/jwt/app.php配置文件
🚀 视频地址
不懂的同学可以了解一下视频,会有详细的说明哦
- 如何使用 JWT 认证插件:https://www.bilibili.com/video/BV1HS4y1F7Jx
- 如何使用 JWT 认证插件(算法篇):https://www.bilibili.com/video/BV14L4y1g7sY
🔰 下载
Package Installs

PHP Version
