Laravel JWT令牌设为1天有效期仍1小时后报401错误求助
问题分析与解决方法
你遇到的问题核心是:只修改了响应中显示的expires_in数值,但实际生成JWT令牌时的有效期还是默认的1小时。respondWithToken里的expires_in只是返回给前端的提示值,并不会改变令牌本身的过期时间。
核心原因
JWT令牌的有效期是在生成令牌时由JWT配置或认证guard的工厂类决定的,你当前只是修改了返回给前端的显示值,没有真正调整令牌生成时的TTL(Time To Live)配置。
解决步骤
方法1:修改全局JWT配置文件
找到项目根目录下的config/jwt.php文件,找到ttl配置项,将其值改为1440(单位是分钟,1440分钟=1天):
/* |-------------------------------------------------------------------------- | JWT TTL |-------------------------------------------------------------------------- | | The time to live (in minutes) of the token. | */ 'ttl' => env('JWT_TTL', 1440),
如果用环境变量管理配置,也可以在.env文件中添加:
JWT_TTL=1440
方法2:针对admin_api guard单独设置TTL
如果不想修改全局配置,只想让admin_api guard的令牌有效期为1天,可以在生成令牌前动态设置:
在login方法中添加设置TTL的代码:
public function login(Request $request) { $credentials = $request->only(['email', 'password']); // 针对admin_api guard设置TTL为1440分钟(1天) auth()->guard('admin_api')->factory()->setTTL(1440); if (!$token = auth()->guard('admin_api')->attempt($credentials)) { return response()->json(['error' => 'Unauthorized'], 401); } $response = []; array_push($response, $this->respondWithToken($token), $this->me()); return response()->json($response); }
同时,respondWithToken里的expires_in可以简化为和实际TTL一致的计算:
'expires_in' => auth()->guard('admin_api')->factory()->getTTL() * 60
方法3:排查自定义覆盖逻辑
如果以上方法无效,检查是否存在以下情况:
- 自定义了JWT工厂类,覆盖了默认TTL设置
- 中间件中动态修改了令牌有效期
- 缓存了JWT配置,需要执行
php artisan config:clear清除配置缓存
验证修改是否生效
可以通过以下方式确认令牌有效期是否改为1天:
- 生成令牌后,用JWT解析工具解析令牌,查看
exp字段对应的时间是否为当前时间+1天 - 在代码中打印当前guard的TTL值:
dd(auth()->guard('admin_api')->factory()->getTTL());
如果输出是1440,说明配置生效。
内容的提问来源于stack exchange,提问作者OsamaTheCoder
相关产品推荐
相关产品推荐

