tymon/jwt-auth 在 Laravel 9+ 失败,因其最后稳定版 v1.0.2 不兼容 PHP 8.1+ 类型系统与已移除的 booting() 钩子,导致服务提供者未找到、命令不存在等错误;官方推荐改用 Laravel Sanctum。

JWT-Auth 库(tymon/jwt-auth)在 Laravel 5.5–8.x 中可用,但 Laravel 9+ 官方已弃用并停止维护,直接安装会报错或无法注册服务提供者。
为什么 composer require tymon/jwt-auth 在 Laravel 9+ 失败?
Laravel 9 起强制要求 PHP 8.0+,而 tymon/jwt-auth 最后稳定版(v1.0.2)未完全适配 PHP 8.1+ 的类型系统和反射变更;其 JWTAuthServiceProvider 依赖已被 Laravel 移除的 Illuminate\Support\ServiceProvider::booting() 钩子。
常见错误包括:
Class "Tymon\JWTAuth\Providers\LaravelServiceProvider" not foundTarget class [jwt.auth] does not exist- 执行
php artisan jwt:secret报错:Command not found
Laravel 9+ 推荐替代方案:使用 laravel/jetstream + laravel/sanctum
Sanctum 是 Laravel 官方维护的轻量 Token 认证方案,专为 SPA、移动端 API 设计,支持 Token 模型绑定、过期控制、多设备登录,且与 Laravel 9/10/11 兼容性零问题。
实操步骤:
- 运行
composer require laravel/sanctum - 执行
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider" - 运行
php artisan migrate(生成personal_access_tokens表) - 在
app/Models/User.php中添加use Laravel\Sanctum\HasApiTokens;并混入HasApiTokens - API 登录示例:用户验证后调用
$user->createToken('api-token')->plainTextToken
注意:sanctum 默认不处理刷新 Token,如需类似 JWT 的 refresh 流程,得自行实现或改用 spatie/laravel-permission + 自定义中间件组合。
非要继续用 tymon/jwt-auth?只能降级或找 fork 版
若项目强依赖 JWT 的无状态刷新机制,且无法重构,可考虑以下路径(不推荐新项目):
- 锁定 Laravel 8.75 + PHP 7.4–8.0,并安装
tymon/jwt-auth:^1.0 - 或尝试社区维护的 fork,如
php-jwt-auth/jwt-auth(非官方,需手动测试兼容性) - 手动注册服务提供者时,必须重写
boot()方法,避免调用已移除的booting() -
config/jwt.php中的secret不再通过php artisan jwt:secret生成,需用base64_encode(random_bytes(32))手动生成并填入
JWT 的密钥轮换、黑名单位置、跨域 Token 存储方式这些细节,在 Laravel 9+ 环境下容易被默认配置掩盖,实际部署时比 Sanctum 更易出错。










