只支持 thinkphp 6.0
稳定版
$ composer require xiaodi/think-jwt
开发版
$ composer require xiaodi/think-jwt:dev-next
- 配置
config/jwt.php
完整配置
<?php
return [
'stores' => [
// 单应用时 默认使用此配置
'default' => [
'sso' => [
'enable' => false,
],
'token' => [
'signer_key' => 'tant',
'public_key' => 'file://path/public.key',
'private_key' => 'file://path/private.key',
'not_before' => 0,
'expires_at' => 3600,
'refresh_ttL' => 7200,
'signer' => 'Lcobucci\JWT\Signer\Hmac\Sha256',
'type' => 'Header',
'relogin_code' => 50001,
'refresh_code' => 50002,
'iss' => 'client.tant',
'aud' => 'server.tant',
'automatic_renewal' => false,
],
'user' => [
'bind' => false,
'class' => null,
]
],
// 多应用时 对应应用的配置
'admin' => [
'sso' => [
'enable' => false,
],
'token' => [
'signer_key' => 'tant',
'not_before' => 0,
'expires_at' => 3600,
'refresh_ttL' => 7200,
'signer' => 'Lcobucci\JWT\Signer\Hmac\Sha256',
'type' => 'Header',
'relogin_code' => 50001,
'refresh_code' => 50002,
'iss' => 'client.tant',
'aud' => 'server.tant',
'automatic_renewal' => false,
],
'user' => [
'bind' => false,
'class' => null,
]
]
],
'manager' => [
// 缓存前缀
'prefix' => 'jwt',
// 黑名单缓存名
'blacklist' => 'blacklist',
// 白名单缓存名
'whitelist' => 'whitelist'
]
];
signer_key
密钥not_before
时间前不能使用 默认生成后直接使用refresh_ttL
Token有效期(秒)signer
加密算法type
获取 Token 途径relogin_code
Token过期抛异常code = 50001refresh_code
Token失效异常code = 50002automatic_renewal
开启过期自动续签
bind
是否注入用户模型(中间件有效)class
用户模型类文件
prefix
缓存前缀blacklist
黑名单缓存名whitelist
白名单缓存名
以下两个异常都会抛一个HTTP异常 StatusCode = 401
xiaodi\Exception\HasLoggedException
xiaodi\Exception\TokenAlreadyEexpired
- File
- Redis
namespace app\home\controller\Auth;
use xiaodi\JWTAuth\Facade\Jwt;
public function login()
{
//...登录判断逻辑
// 自动获取当前应用下的jwt配置
return json([
'token' => Jwt::token($uid, ['params1' => 1, 'params2' => 2])->toString(),
]);
// 自定义用户模型
return json([
'token' => Jwt::token($uid, ['model' => CustomMember::class])->toString(),
]);
}
自动获取当前应用(多应用下)配置。
use xiaodi\JWTAuth\Facade\Jwt;
use xiaodi\JWTAuth\Exception\HasLoggedException;
use xiaodi\JWTAuth\Exception\TokenAlreadyEexpired;
class User {
public function test()
{
if (true === Jwt::verify($token)) {
// 验证成功
}
// 验证成功
// 如配置用户模型文件 可获取当前用户信息
dump(Jwt::user());
}
}
use xiaodi\JWTAuth\Middleware\Jwt;
// 自动获取当前应用配置
Route::get('/hello', 'index/index')->middleware(Jwt::class);
// 自定义应用 使用api应用配置
Route::get('/hello', 'index/index')->middleware(Jwt::class, 'api');
支持以下方式自动获取
Header
Cookie
Url
赋值方式
类型 | 途径 | 标识 |
---|---|---|
Header | Authorization | Bearer Token |
Cookie | Cookie | token |
Url | Request | token |
# config/jwt.php
<?php
return [
'apps' => [
'admin' => [
'token' => [
// ...其它配置
'type' => 'Header',
// 'type' => 'Cookie',
// 'type' => 'Url',
// 支持多种方式获取
// 'type' => 'Header|Url',
]
]
]
];
app/config/jwt.php
automaticRenewal => true
系统检测到 Token 已过期, 会自动续期并返回以下 header 信息。
- Automatic-Renewal-Token
- Automatic-Renewal-Token-RefreshAt
前端需要接收最新 Token,下次异步请求时,携带此 Token。
注销指定应用下缓存的用户 (强制下线 重新登录)
$store = 'wechat';
app('jwt.manager')->destroyStoreWhitelist($store);
注销指定某个用户(强制下线 重新登录)
$store = 'wechat';
$uid = '9527';
app('jwt.manager')->destroyToken($id, $store);