必须借助firebase/php-jwt库实现jwt鉴权,因其稳定、合规且thinkphp无原生支持;需安装依赖、封装jwtservice类、配置密钥、编写校验中间件并绑定路由。

如果您在ThinkPHP项目中需要实现无状态、跨域友好的用户身份验证,则必须借助外部JWT库完成签发与校验逻辑。Firebase/php-jwt是当前最稳定、维护活跃且符合RFC 7519标准的PHP JWT实现,ThinkPHP自身不提供JWT原生支持。以下是集成与验证的具体操作路径:
一、安装firebase/php-jwt依赖
该步骤确保项目具备JWT编码与解码能力,所有签名、base64url编码、时间戳校验均由官方库内部处理,避免手写逻辑引入安全漏洞。
1、在项目根目录执行Composer命令安装扩展包。
2、运行 composer require firebase/php-jwt,确认vendor/autoload.php自动加载机制已启用。
3、验证安装成功:在控制器中临时执行 class_exists('Firebase\JWT\JWT'),返回true即为可用。
二、创建独立的JWT服务类
封装生成与验证逻辑可复用、便于配置管理,并强制密钥从配置文件读取,杜绝硬编码风险。服务类应置于app\common\service或app\service命名空间下,与业务逻辑解耦。
1、新建文件 app\common\service\JwtService.php。
2、定义类结构,使用 config('jwt.secret') 获取密钥,而非直接写死字符串。
3、在 generateToken() 方法中构造 payload,必须包含 iat(签发时间)和 exp(过期时间) 字段,且 exp 值为 time() + 3600 等动态计算结果。
4、调用 \Firebase\JWT\JWT::encode($payload, $key, 'HS256') 生成token,禁止拼接header或手动base64编码。
三、配置JWT密钥与基础参数
将密钥及关键策略参数外置到配置文件,便于多环境切换与密钥轮换,同时规避Git泄露风险。
1、在 config/ 目录下新建 jwt.php 配置文件。
2、写入以下内容:return ['secret' => env('JWT_SECRET', 'default_secret_key_2026')];
3、在 .env 文件中添加 JWT_SECRET=your_production_secret_here,开发环境可设为随机字符串。
4、确保 date_default_timezone_set('UTC') 已在应用启动时执行,防止时区偏差导致 exp 校验失败。
四、编写Token校验中间件
中间件负责统一拦截请求、提取并验证Authorization头中的Bearer Token,失败时中断流程,成功则注入用户上下文,供后续控制器使用。
1、执行 php think make:middleware JwtAuthMiddleware 创建中间件。
2、在 handle() 方法开头检查请求头:$auth = $request->header('authorization');
3、使用 str_starts_with($auth, 'Bearer ') 判断格式合法性,再截取 token 字符串。
4、调用 \Firebase\JWT\JWT::decode($token, new \Firebase\JWT\Key($key, 'HS256')) 解析,捕获 SignatureInvalidException、ExpiredException、BeforeValidException 三类异常并分别响应。
5、解析成功后,执行 $request->withAttribute('uid', $decoded->user_id) 写入用户ID,确保下游可通过 $request->getAttribute('uid') 安全获取。
五、在路由中绑定中间件并测试
通过中间件注册机制,使受保护接口自动触发JWT校验,无需每个控制器重复编写验证逻辑,保障权限控制一致性。
1、在 route/app.php 中定义API路由组:Route::group(['middleware' => 'JwtAuthMiddleware'], function () { ... });
2、在测试接口中打印 $request->getAttribute('uid'),确认非空且为预期数值。
3、使用 curl 或 Postman 发起带 header 的请求:Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...
4、若返回 401 Unauthorized,检查中间件是否漏写 return $next($request);,该语句缺失将导致静默失败。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











