thinkphp无内置jwt,必须用firebase/php-jwt;中间件须设jwt::$leeway=60并严格校验exp/iss,否则90%出现401静默失败或过期放行。

直接说结论:别碰任何“ThinkPHP内置JWT”说法,它根本不存在;必须用 firebase/php-jwt,且中间件里不设 JWT::$leeway 或漏校验 exp/iss,90%的 401 静默失败或过期仍放行都出在这儿。
怎么装和配JWT——别信“tp自带jwt”这种误导
ThinkPHP 没有内置 JWT 实现,所有“think\facade\Jwt”或“tp6-jwt”封装都是第三方扩展,稳定性差、更新慢、文档错漏多。唯一推荐路径是:
- 运行
composer require firebase/php-jwt:^6.10(2026年最新稳定版,兼容 PHP 8.2+) - 在
config/jwt.php里定义密钥和基础参数,**密钥必须 ≥32 字节随机字符串**,别用'123456'这类弱密钥 - 配置示例中
'exp' => 7200是秒数,但实际签发时得动态算:'exp' => time() + config('jwt.exp'),否则固定值会出问题 - 禁止把密钥写进控制器或模型——统一走
config('jwt.secret'),开发/生产环境靠 .env 切换
中间件里 decode() 总报错——先看是不是Bearer没截干净
最常见现象是 DomainException: Signature verification failed,表面是签名错,实则 80% 是 token 字符串本身带了 Bearer 前缀或空格。HTTP Header 的 Authorization 值不是纯 token,必须手动剥离:
- 用
$auth = $request->header('authorization', '')取头,别用$_SERVER - 加前置判断:
if (!str_starts_with($auth, 'Bearer ')) { throw new \InvalidArgumentException('Missing Bearer'); } - 再取 token:
$token = trim(substr($auth, 7)),trim()必须加,防换行或空格 - 解码前务必设容错:
\Firebase\JWT\JWT::$leeway = 60,否则服务器时间比客户端快/慢几十秒就直接报ExpiredException
payload 里该塞什么、不该塞什么——base64 不是加密
JWT 的 payload 是 base64url 编码,**任何客户端都能解码查看**,所以:
- 必须包含
iat(签发时间)、exp(过期时间)、iss(签发方,如'iss' => config('app.name')),缺一不可,否则decode()直接抛DomainException - 可存
user_id、role、scope这类非敏感标识字段,用于后续权限判断 - 绝对禁止塞
password、phone、id_card等明文敏感信息——这不是传输加密方案 - 如果需要用户角色控制,建议只存
role_id,权限细节查数据库或缓存,别全堆进 token 膨胀体积
怎么让 Auth::check() 识别 JWT 用户——不能动 think\Auth 类
ThinkPHP 的 RBAC 权限系统依赖 think\Auth::check() 返回布尔值,它默认从 session 读 uid。JWT 场景下不能改这个类,而是桥接:
- 在认证中间件成功解析 token 后,调用
$request->withAttribute('uid', $decoded->user_id) - 新建
app\common\service\JwtAuth.php,实现check($rule, $uid = null)方法:若$uid为空,则从$request->getAttribute('uid')取,再调原think\Auth::check($rule, $uid) - 业务控制器里统一用
$this->request->getAttribute('uid')获取当前用户 ID,别再查 session 或 cookie - 注意:命令行任务、队列、模型事件里没有 HTTP request 对象,这类场景禁用 JWT 解析逻辑,会直接崩
真正麻烦的从来不是生成 token,而是 exp 校验偏差、Bearer 截取遗漏、leeway 没设、iss 没验这四点——它们藏在中间件几行代码里,但会让整个鉴权链路在上线后随机失效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











