ThinkPHP6 使用 JWT 实现无状态鉴权,核心是封装 Token 生成与校验逻辑、通过中间件统一拦截验证、安全配置密钥与过期策略,并强化传输存储及敏感操作防护。

ThinkPHP6 添加授权 Token 加密,核心是用 JWT(JSON Web Token)替代 Session 实现无状态鉴权。关键不在“添加加密”,而在于正确生成、安全存储、统一校验Token,并确保签名密钥不硬编码、不过期策略合理、传输方式合规。
配置 JWT 依赖与密钥
先安装官方推荐的 JWT 库:
- 运行
composer require firebase/php-jwt:^6.0(建议用 v6+,兼容 PHP 8+,更安全) - 在
config/jwt.php中集中管理配置,避免写死在逻辑里:
return [
'key' => env('JWT_SECRET', 'your_strong_random_string_here'), // 从 .env 读取,严禁明文写死
'alg' => 'HS256',
'exp' => 7200, // 2小时过期,按业务调整
'leeway' => 60, // 容忍时钟偏差 60 秒
];
同时在 .env 文件中添加:
JWT_SECRET=9f8e7d6c5b4a3210fedcba9876543210
封装 Token 生成与解析逻辑
不要把 JWT::encode/decode 直接写在控制器里。新建 app/common/JwtAuth.php 封装:
集中式 API token 管理。将 token 存于 .env,设失效日期;用脚本批量测权限;在 connections/ 文档记录;设日历提醒续期。防重复索要凭证,保证 token 安全并追踪失效。
立即学习“PHP免费学习笔记(深入)”;
-
签发 Token:只塞必要字段(如
uid、exp、iat),不传敏感信息(密码、手机号等) -
验证 Token:捕获
ExpiredException、SignatureInvalidException等标准异常,返回结构化错误码 - 使用
new Key(config('jwt.key'), config('jwt.alg'))替代旧版字符串密钥传参,符合 v6+ 接口规范
通过中间件统一拦截校验
创建中间件 app/middleware/CheckJwtToken.php:
- 从请求头
Authorization: Bearer xxx提取 Token(注意大小写和空格) - 调用封装好的 JwtAuth::verify() 方法校验
- 校验成功后,把用户 ID 注入到 Request 对象或上下文,后续控制器可直接获取:
$this->request->uid - 对登录、注册等免鉴权接口,跳过该中间件
增强安全性细节
Token 本身不是“加密”,而是签名防篡改。真正要加固的是整个链路:
- 前端存储 Token 用
httpOnly: false的 localStorage 或 sessionStorage,禁用 cookie 自动携带 - 后端响应头加
Access-Control-Expose-Headers: Authorization,方便前端读取新刷新的 Token - 敏感操作(如改密、删账号)要求二次验证(如输入原密码或短信验证码),不单靠 Token
- 退出登录时,服务端可维护一个短期黑名单(如 Redis 缓存已注销 Token 的 jti + exp),防止 Token 被复用


















