fix(web): 修复微信回调页token时序bug - 先存token再取用户信息 #764
Reference in New Issue
Block a user
Delete Branch "fix/wechat-callback-token-order"
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?
问题
WechatCallback页面存在与#734相同的时序bug:
getCurrentUser()在setAuth()之前执行,apiClient 请求拦截器从 localStorage 读不到 token,请求不带 Authorization header → 后端返回 401 → 触发响应拦截器登出逻辑 → 跳回登录页。根因
#734 只修复了
useAuth.ts里的useLogin和useWechatCallbackhook,但WechatCallback.tsx页面没有复用 hook,自己实现了一遍登录逻辑,漏掉了 token 存储时序的修复。修复
与 #734 修复方式一致:
改动
apps/web/src/pages/auth/WechatCallback.tsx关联: #558, #734
CI全绿,自动审批通过。
CI全绿,自动审批通过。
代码审查结果 - PR #764
⚠️ 问题(2个需要修改)
apps/web/src/pages/auth/WechatCallback.tsx 第42-46行:状态同步风险,异常情况下会导致状态不一致。
getCurrentUser()之前手动将 token 写入localStorage。如果getCurrentUser()请求失败(如网络错误或 401),代码抛出异常或进入 catch 块,导致后续的setAuth()未执行。此时localStorage中残留了 token,但 AuthStore 中的用户状态未更新,造成“有 Token 但未登录”的僵尸状态。localStorage.setItem的逻辑移至setAuth函数内部统一管理,或者确保在catch块中清除已写入的 token。apps/web/src/test/pages/auth/WechatCallback.test.tsx 第16行:测试覆盖率不足,核心逻辑未被验证。
wechatCallback返回了一个永远 pending 的 Promise (new Promise(() => {}))。这导致测试仅停留在 Loading 状态,本次 PR 新增的“手动写入 Token”和“调用 getCurrentUser”的关键逻辑路径从未被执行。wechatCallback成功 resolve 的情况,验证localStorage.setItem是否被正确调用以及getCurrentUser是否被触发。💡 建议(1个可选)
localStorage。这属于副作用依赖,建议重构请求拦截器,使其直接从 AuthStore(内存状态)读取 Token,从而避免在业务代码中手动同步localStorage,降低状态管理复杂度。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 性能无问题
🤖 由 AI 代码审查机器人自动生成 | 2026-07-23 11:28:03 | 模型:
🗑️ 预览环境已清理
PR #764 已关闭或合并,对应的预览环境已被清理。