You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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天:

  1. 生成令牌后,用JWT解析工具解析令牌,查看exp字段对应的时间是否为当前时间+1天
  2. 在代码中打印当前guard的TTL值:
dd(auth()->guard('admin_api')->factory()->getTTL());

如果输出是1440,说明配置生效。

内容的提问来源于stack exchange,提问作者OsamaTheCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 05:48:22