用户列表接口和角色列表接口 都按要求增加get_current_user_with_refresh ,token还是同样的问题,未得到解决
@router.get("/admin/users") async def get_users(
request: Request,
current_user: dict = Depends(get_current_user_with_refresh),
page: int = 1,
page_size: int = 20,
keyword: Optional[str] = None
):
@router.get("/admin/roles") async def api_get_all_roles(
request: Request,
current_user: dict = Depends(get_current_user_with_refresh),
page: int = 1,
page_size: int = 20,
keyword: Optional[str] = None,
#credentials: HTTPAuthorizationCredentials = Depends(security)
):
前端401处理 - 完成
后端Token验证和刷新逻辑 - 完成
verify_and_refresh_token() 函数实现滑动过期认证依赖函数 - 完成
get_current_user_with_refresh 已创建>>> [依赖函数] 开头)request.state.new_token响应处理中间件 - 完成
request.state.new_tokenX-New-Token 到响应头>>> [响应中间件] 开头)中间件注册 - 完成
TokenRefreshMiddleware 已注册视图函数更新 - 部分完成
verify_token用户反馈:即使用户列表和角色列表接口已使用新依赖,token仍然没有刷新。
关键:必须重启后台服务器!
代码修改后,如果没有重启服务器,修改不会生效。
cd LQAdminPlatform
python 诊断Token刷新问题.py
这个脚本会检查:
cd LQAdminPlatform
# 按 Ctrl+C 停止当前服务器
python src/main.py
检查启动日志,必须看到:
✅ Token刷新中间件已注册
✅ Token响应处理中间件已注册
详细步骤请查看:快速测试Token刷新.md
简要步骤:
预期日志:
>>> [响应中间件] 处理请求: /api/v1/system/admin/users
>>> [依赖函数] get_current_user_with_refresh 被调用
Token验证信息 - 用户: admin
Token配置时长: 5 分钟
Token已使用时长: 3.00 分钟
Token刷新: 已使用时长超过阈值,生成新token
>>> [依赖函数] Token已刷新,新token已存储到request.state
>>> [响应中间件] 发现新token,添加到响应头
在浏览器开发者工具 -> Network -> 选择请求 -> Headers -> Response Headers
应该看到:
X-New-Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
X-Token-Refreshed: true
应该看到:
Token已自动刷新
LOG_LEVEL=INFO>>> 前缀的日志都是为了调试添加的,方便快速定位问题文件: LQAdminFront/src/api/request.ts
改动说明:
测试方法:
文件: LQAdminPlatform/src/app/services/jwt_token.py
改动说明:
配置参数:
ADMIN_TOKEN_EXPIRE_MINUTES: Token总有效期(分钟),当前配置为 60 分钟测试方法:
文件:
LQAdminPlatform/src/app/services/jwt_token.pyLQAdminPlatform/src/app/middleware/token_refresh_middleware.py改动说明: 用户每次访问后台接口时,日志会打印以下信息:
Token验证信息 - 用户: admin
Token配置时长: 60 分钟
Token创建时间: 2026-02-08 10:00:00 UTC
Token过期时间: 2026-02-08 11:00:00 UTC
Token已使用时长: 15.50 分钟 (930 秒)
Token剩余时长: 44.50 分钟 (2670 秒)
Token刷新: 未达到刷新阈值 (30.00 分钟),继续使用当前token
当token被刷新时:
Token刷新: 已使用时长超过阈值 (30.00 分钟),生成新token
Token已刷新,用户: admin, 路径: /api/system/profile
测试方法:
正常使用场景(应该不会超时):
长时间不操作场景(应该超时):
边界测试:
检查日志中是否包含:
Token时长配置位于 LQAdminPlatform/src/app/config/config.ini:
[admin_app]
# 后台管理Token配置
ADMIN_TOKEN_EXPIRE_MINUTES=60 # Token总有效期(分钟)
ADMIN_REFRESH_TOKEN_EXPIRE_HOURS=24 # Refresh Token有效期(小时)
可根据实际需求调整这些参数。
从错误堆栈 request.ts:65:27 可以看出,错误发生在成功响应拦截器中,而不是401错误处理器中。
原因: 后台返回的是 HTTP 200 + 业务错误码401,而不是 HTTP 401
HTTP/1.1 200 OK
{
"code": 401,
"message": "无效的访问令牌"
}
在成功响应拦截器中添加了对业务错误码401的检查:
code === 401 时立即跳转现在代码同时处理两种401情况:
LQAdminFront/src/api/request.ts - 前端401处理逻辑 + Token自动更新(已增强调试日志和多重跳转保障)LQAdminPlatform/src/app/services/jwt_token.py - Token验证和刷新逻辑,添加详细日志LQAdminPlatform/src/app/middleware/token_refresh_middleware.py - 中间件日志增强前端调用接口返回401时没有自动跳转到登录页面。
在 LQAdminFront/src/api/request.ts 中实施了以下增强:
router.push('/login')router.replace('/login') (如果push失败)window.location.href = '/login' (最后的保障)重要!修改后必须重启前端开发服务器:
# 停止当前服务器(Ctrl+C)
cd LQAdminFront
npm run dev
清除浏览器缓存:
测试401跳转:
sso_access_token 的值为 invalid_token_test预期结果:
=== 401错误处理开始 === 等日志详细的排查步骤请查看:LQAdminFront/401跳转问题排查指南.md
前端响应拦截器会自动检查响应头中的 X-New-Token,如果存在则自动更新本地存储的token:
// 检查响应头中是否有新的token(滑动过期机制)
const newToken = response.headers['x-new-token']
if (newToken) {
// 更新本地存储的token,保留原有的refresh token
const refreshToken = getRefreshToken()
saveToken(newToken, refreshToken || undefined)
console.log('Token已自动刷新')
}
这样用户在正常使用过程中,token会自动刷新,无需手动处理。