jwt-auth已停止维护且与Laravel 9+、PHP 8.1+兼容性差,推荐改用Laravel Sanctum或手动集成firebase/php-jwt实现JWT逻辑。

别急着用 jwt-auth —— 它早已停止维护,且与 Laravel 9+、PHP 8.1+ 兼容性极差,直接 composer require tymon/jwt-auth 很可能报错或引发鉴权逻辑静默失效。
为什么 tymon/jwt-auth 现在不能直接用
这个包最后一次正式发布是 2020 年(v1.0.2),其底层依赖 namshi/jose 已废弃,且未适配 PHP 8.1 的枚举类型和 Laravel 的新 Contract 结构。常见表现包括:
Class "Tymon\JWTAuth\Providers\LaravelServiceProvider" not found- 登录成功但
auth()->user()返回null,且无任何错误提示 - 刷新 token 时抛出
BadMethodCallException: Method Illuminate\Http\Request::getParsedBody() does not exist
它不是“装不上”,而是“装上后跑不稳”——尤其在生产环境里,token 解析失败往往只体现为 401,排查成本远高于重选方案。
推荐替代:用 laravel/sanctum 做 API Token 认证
Sanctum 是 Laravel 官方维护的轻量认证方案,专为 SPA、移动端和简单 token 场景设计,无需密钥管理、无 JWT 签名开销,且默认兼容所有现代 Laravel 版本。
- 安装:
composer require laravel/sanctum,然后运行php artisan sanctum:install - 在
app/Providers/AuthServiceProvider.php的boot()中添加:Sanctum::usePersonalAccessTokenModel(PersonalAccessToken::class);(如需自定义 token 模型) - API 路由加中间件:
->middleware('auth:sanctum'),客户端只需在请求头带Authorization: Bearer {token} - 生成 token 示例:
$token = $user->createToken('api-token')->plainTextToken;
它不解决“跨域无 Cookie”的全部问题,但对绝大多数前后端分离项目,比硬套 JWT 更可靠、更省心。
真需要 JWT?用 firebase/php-jwt 手动实现核心逻辑
如果业务强依赖 JWT 标准(比如要对接第三方 OIDC 提供商、或必须使用 RS256 签名),建议绕过封装包,直接用底层库控制全流程:
- 安装:
composer require firebase/php-jwt - 签发 token 示例:
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
$payload = [
'sub' => $user->id,
'exp' => time() + 3600,
'iat' => time(),
];
$secret = config('app.jwt_secret');
$token = JWT::encode($payload, $secret, 'HS256');
- 验证 token 示例:
try {
$decoded = JWT::decode($token, new Key($secret, 'HS256'));
} catch (\Exception $e) {
// 处理 TokenExpiredException / SignatureInvalidException 等
}
这样你能明确知道每个环节(签名、过期、算法)是否生效,也方便加审计日志、黑名单检查等定制逻辑。
JWT 不是银弹,jwt-auth 更不是快捷键。真正卡住你的,往往不是“怎么生成 token”,而是“token 什么时候该失效”“refresh 流程谁来触发”“前端存到 localStorage 还是 httpOnly Cookie”。这些决策没法靠一个 Composer 包自动完成。











