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

Laravel使用tymon jwt-auth刷新token时获取用户ID更新最后登录时间的问题

问题原因

你调用authenticate()时抛出过期错误,是因为用于刷新的旧token已经过了访问有效期,该方法默认会校验token的过期时间,所以直接抛出异常。而刷新逻辑本身是允许过了访问有效期但还在刷新有效期内的token换取新token的,你只需要调整下代码执行顺序或者直接解析token payload即可。

解决方案

方案1:先刷新token再获取用户

刷新token的操作执行成功后,用户实例会自动挂载到auth认证实例上,直接获取即可:

public function refresh()
{
    try {
        // 先执行刷新操作,拿到新token
        $newToken = auth()->refresh();
        // 此时已经可以正常获取用户id
        if ($userId = auth()->id()) {
            ProcessLastUserLogin::dispatch($userId, Carbon::now());
        }
    } catch (\Exception $e) {
        Log::debug('token刷新失败', ['error' => $e->getMessage()]);
        return response()->json(['message' => '登录已过期,请重新登录'], 401);
    }

    return $this->respondWithToken($newToken, true);
}

方案2:直接解析旧token payload获取用户id

如果需要在刷新前拿到用户信息,可以只解析token payload,跳过过期校验:

public function refresh()
{
    try {
        // 仅解析payload,不校验token过期时间
        $payload = JWTAuth::parseToken()->getPayload();
        // jwt标准中sub字段默认存储用户id
        $userId = $payload->get('sub');
        // 刷新token
        $newToken = auth()->refresh();
        // 刷新成功后再执行更新操作,避免无效请求触发逻辑
        ProcessLastUserLogin::dispatch($userId, Carbon::now());
    } catch (\Exception $e) {
        Log::debug('操作失败', ['error' => $e->getMessage()]);
        return response()->json(['message' => '登录已过期,请重新登录'], 401);
    }

    return $this->respondWithToken($newToken, true);
}

注意事项

确保你的刷新接口路由已经配置了jwt.auth中间件,或者你手动处理了token的解析逻辑,否则会无法正常识别请求携带的token。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 08:48:00