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
相关产品推荐
相关产品推荐

