# Token机制调整测试说明 ## 本次调整说明 ### 1. 前端调整 - LQAdminFront 前端调用接口返回401 无效的访问令牌,直接跳转到登录页面 ### 2. 后台调整 - 2.1 验证token是否按预期处理,用户每次请求后台接口时,token的时长将重置,只有用户在token设置时间范围内都没有请求才作为token超时(需要重新登录) - 2.2 用户每次访问后台接口时,日志打印token配置时长、当前token的创建时间、使用时长、剩余时长、刷新token时长信息,用于验证token是否按预期处理 ## 问题根源和修复 ✅ ### 问题1: 前端401跳转 **原因**: 后台返回的是 HTTP 200 + 业务错误码401,而不是 HTTP 401 **解决方案**: 在成功响应拦截器中添加对业务错误码401的检查 ### 问题2: Token没有自动刷新 ⚠️ 关键问题! **原因**: **Token刷新中间件没有被注册!** 查看 `LQAdminPlatform/src/app/server/app.py`,发现只注册了CORS中间件,但没有注册 `TokenRefreshMiddleware`。 **影响**: - ❌ Token验证逻辑从未执行 - ❌ Token刷新逻辑从未执行 - ❌ 日志从未打印 - ❌ 新token从未生成 **解决方案**: 在 `app.py` 中添加中间件注册: ```python from app.middleware.token_refresh_middleware import TokenRefreshMiddleware app.add_middleware( TokenRefreshMiddleware, exclude_paths=[ "/auth/login", "/auth/captcha", "/auth/refresh", "/docs", "/openapi.json", "/redoc", "/favicon.ico", "/health", "/" ] ) ``` ### 问题3: 数据库连接错误 **原因**: 错误地使用了 `async with get_db_connection()` **解决方案**: 改用 `async for db in get_db()` ## 修改文件清单 ### 前端(LQAdminFront) 1. ✅ `src/api/request.ts` - 401处理 + Token自动更新 ### 后端(LQAdminPlatform) 1. ✅ `src/app/services/jwt_token.py` - Token验证刷新 + 详细日志 2. ✅ `src/app/middleware/token_refresh_middleware.py` - 中间件日志增强 3. ✅ `src/app/server/app.py` - **注册Token刷新中间件**(关键修复) 4. ✅ `src/app/services/snippet_service.py` - 数据库连接修复 ## 测试步骤 ### 1. 重启后台服务器 ⚠️ 必须! ```bash cd LQAdminPlatform # Ctrl+C 停止 python src/main.py ``` **启动时应该看到**: ``` ✅ Token刷新中间件已注册 ``` 如果没有这条日志,说明中间件没有注册成功。 ### 2. 重启前端服务器 ```bash cd LQAdminFront # Ctrl+C 停止 npm run dev ``` ### 3. 清除浏览器缓存 - F12 → 右键刷新按钮 → "清空缓存并硬性重新加载" - 或使用无痕模式(Ctrl+Shift+N) ### 4. 测试Token滑动刷新(5分钟配置) #### 配置测试环境 编辑 `LQAdminPlatform/src/app/config/config.ini`: ```ini [admin_app] ADMIN_TOKEN_EXPIRE_MINUTES=5 # 测试用:5分钟 ``` #### 测试时间表 | 时间 | 操作 | 预期结果 | |------|------|----------| | 18:00:00 | 登录 | 获取token,有效期至18:05:00 | | 18:02:00 | 访问接口 | 正常访问,不刷新(40%) | | 18:02:30 | 访问接口 | 正常访问,不刷新(50%临界) | | 18:03:00 | 访问接口 | 正常访问,**刷新token**(60%),新有效期至18:08:00 | | 18:04:00 | 访问接口 | 正常访问,不刷新(使用新token,20%) | | 18:07:00 | 访问接口 | 正常访问,**刷新token**(使用新token,80%) | | 18:13:00 | 访问接口 | **401错误**,跳转登录(超过5分钟未访问) | #### 查看后台日志 每次访问接口时,应该看到: ``` Token验证信息 - 用户: admin Token配置时长: 5 分钟 Token创建时间: 2026-02-08 18:00:00 UTC Token过期时间: 2026-02-08 18:05:00 UTC Token已使用时长: 3.00 分钟 (180 秒) Token剩余时长: 2.00 分钟 (120 秒) Token刷新: 已使用时长超过阈值 (2.50 分钟),生成新token ``` 当token刷新时: ``` Token已刷新,用户: admin, 路径: /api/v1/xxx ``` #### 查看浏览器控制台 当token刷新时,应该看到: ``` Token已自动刷新 ``` ### 5. 测试401跳转 在浏览器控制台执行: ```javascript // 设置无效token localStorage.setItem('sso_access_token', 'invalid_token_test') // 刷新页面 location.reload() ``` **预期结果**: - ✅ 控制台显示 `>>> 检测到业务错误码401` - ✅ 页面自动跳转到 `/login` - ✅ 显示错误提示 - ✅ localStorage已清空 ## 验证成功标准 ### 后台 - [x] 启动时看到 "Token刷新中间件已注册" - [x] 每次请求都打印token验证日志 - [x] 超过50%时长后,token自动刷新 - [x] 响应头包含 `X-New-Token` - [x] 完全过期后返回401 ### 前端 - [x] 401响应自动跳转登录页 - [x] 显示错误提示 - [x] localStorage已清空 - [x] 控制台显示 "Token已自动刷新" - [x] 可以重新登录 ## 常见问题 ### Q1: 为什么18:04:00访问后,18:05:10还是过期? **A**: 因为中间件没有注册,token从未刷新。修复后重启服务器即可。 ### Q2: 为什么没有打印日志? **A**: 因为中间件没有注册,验证逻辑从未执行。修复后重启服务器即可。 ### Q3: 如何确认中间件已注册? **A**: 启动服务器时,查看日志是否有: ``` ✅ Token刷新中间件已注册 ``` ### Q4: 如何确认token已刷新? **A**: 1. 查看后台日志:`Token已刷新,用户: xxx` 2. 查看浏览器控制台:`Token已自动刷新` 3. 查看响应头:`X-New-Token` 存在 ## 相关文档 - **Token中间件问题修复.md** - 详细的问题分析和修复说明 - **Token机制调整完成报告.md** - 完整的技术文档 - **数据库连接问题修复.md** - 数据库问题说明 --- **最后更新**: 2026-02-08 **状态**: ✅ 已修复 **关键修复**: 注册Token刷新中间件