fix: token刷新数据源统一+非空断言修复+并发竞态锁 #1416
Reference in New Issue
Block a user
Delete Branch "fix/token-refresh-bugs"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
修复 token 刷新 3 个问题:数据源不一致、非空断言崩溃、并发竞态
🚀 预览环境已部署
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
[apps/web/src/api/auth/tokenRefresh.ts: 39-77] 用户登出时存在竞态条件导致重新登录
cancelProactiveRefresh函数仅清除了定时器,但没有取消正在进行的executeTokenRefresh操作。如果用户在 Token 刷新请求进行中(activeRefreshPromisepending)点击登出,虽然clearAuth会清空 Store,但刷新请求仍在后台运行。一旦刷新请求成功返回,executeTokenRefresh中的setAuth会被执行,导致用户被重新“自动登录”,绕过了用户的登出意图。isRefreshCancelled)。在cancelProactiveRefresh中将该标志设为true。在executeTokenRefresh的try块中,调用setAuth之前检查该标志,如果已取消则跳过更新状态。[apps/web/src/api/client.ts: 110] 刷新失败后的重定向路径不一致
executeTokenRefresh返回null(即无 user 或 refreshToken)时,代码将页面重定向到"/"(首页)。而在tokenRefresh.ts的executeTokenRefresh内部 catch 块中,刷新失败是重定向到"/login"。这种不一致可能导致在 401 错误场景下,用户被错误地导向首页(可能再次触发 401 循环或显示访客视图),而不是统一的登录页。window.location.href = "/"修改为window.location.href = "/login",保持认证失败行为的一致性。💡 改进建议(不阻塞合并)
无
✅ 良好实践
activeRefreshPromise锁机制有效解决了并发刷新导致的 Token 覆盖问题。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 性能良好
🤖 由 AI 代码审查机器人自动生成 | 2026-08-18 04:57:50 | 模型:
CI全绿,自动审批通过。
CI全绿,自动审批通过。
🗑️ 预览环境已清理
PR #1416 已关闭或合并,对应的预览环境已被清理。