title: [ISSUE-0001] 主面板「立即登录」按钮点击无反应 description: "点击登录也没有弹窗。我希望出现过的问题,以及改进方案都要做记录。" tags: [issue, auth] created: 2026-05-26 updated: 2026-05-26 type: issue status: fixed severity: critical
[ISSUE-0001] 主面板「立即登录」按钮点击无反应¶
相关 wiki:
popup-auth-state-machine.md
用户感知的现象¶
"点击登录也没有弹窗。我希望出现过的问题,以及改进方案都要做记录。"
主面板顶部显示「立即登录」按钮(说明 user.uid 未加载),但点击按钮完全没反应: - 没有新窗口弹出 - 没有 popup - 没有 toast/通知 - 没有任何视觉反馈
根因分析¶
src/entrypoints/background/index.ts 第 152 行(v0.10.2 引入):
if (type === 'open-login') {
const autoLoginResult = await autoLoginViaCookies(false); // ← force=false
if (autoLoginResult.ok) {
return { success: true, autoLogin: true }; // ← 跳过 openWindow
}
openWindow('login'); // ← 永远到不了
}
autoLoginViaCookies(false) 的行为(src/utils/auto-login.ts:77-83):
if (!force) {
const existingUid = await storage.getItem('local:uid');
const existingToken = await storage.getItem('local:accesstoken');
if (existingUid && existingToken) {
return { ok: true, reason: 'already-logged-in' }; // ← stale 也算 ok
}
}
死循环:
1. 用户之前登录过,storage 有旧 uid+token
2. token 过期失效,但 storage 还在
3. useAuthContext() 拉 user API 失败 → user.uid = undefined → UI 显示「立即登录」
4. 用户点登录 → open-login → autoLoginViaCookies(false) → storage 有 uid 直接返回 ok → background 不开窗
5. UI 还在显示「立即登录」 → 用户继续点 → 重复 4-5
认知不一致:UI 端基于 user API 判断(已 stale),background 端基于 storage 判断(还有残留)。
修复方案¶
改动 1:open-login 改用 force=true¶
// background/index.ts
if (type === 'open-login') {
// v0.10.17:主动点登录 ≠ 静默尝试。必须最终能让用户进入登录态。
const autoLoginResult = await autoLoginViaCookies(true); // ← force=true
if (autoLoginResult.ok) {
return { success: true, autoLogin: true };
}
openWindow('login'); // ← 必弹窗
return { success: true, autoLogin: false, reason: autoLoginResult.reason };
}
force=true 时跳过"已登录就跳过"检查,直接重读 cookie:
- cookie 有效(用户在 web.laifaxin.com 还登着) → 写入新 uid/token,覆盖 stale 值
- cookie 失效 → 走 openWindow 必弹窗
改动 2:UI 端登录成功后 reload¶
// account-vip.tsx / account-info.tsx
onClick={async () => {
const result: any = await browser.runtime
.sendMessage({ type: 'open-login' })
.catch(() => null);
if (result?.autoLogin) {
window.location.reload(); // 让 auth-provider 重新拉 user
}
}}
改动文件¶
| 文件 | 改了什么 |
|---|---|
src/entrypoints/background/index.ts |
open-login 处理改 autoLoginViaCookies(true) |
src/layouts/common/account-vip.tsx |
点登录后检查 autoLogin,成功 reload |
src/layouts/common/account-info.tsx |
同上(头像区登录按钮) |
验证方式¶
- 卸载扩展或清除 storage(模拟干净状态)
- 在浏览器登录 web.laifaxin.com(让 cookie 在)
- 安装/重载扩展 → 应通过 cookie 自动登录,无需点
- 退出 web.laifaxin.com 但保留扩展里的 uid/token(模拟 stale)
- 重启浏览器 → 扩展 user API 失败 → 主面板显示「立即登录」
- 点击「立即登录」 → 应立即弹出登录窗口(修复前不会)
如何避免再犯¶
- 「主动操作」与「静默尝试」必须区分:用户主动点击的入口(登录/重试/刷新)一定要 force=true,避免 stale 缓存吞掉用户意图
- 认知一致性:UI 端和 background 端判断"是否登录"必须基于同一信号源。当前 UI 看 user.uid,background 看 storage —— 这种割裂必须由"force=true 重拉真值"打破
- 任何"用户点了什么但什么都没发生"是 P0 bug:登录、保存、提交 这类按钮的 onClick 必须有可见反馈(reload / toast / 弹窗 / 状态变化)
- 每次改 auth/login 路径 → 必跑「用户场景」清单:
- 干净状态 → 点登录 → 应弹窗
- 有效登录 → 点登录 → 应自动登录
- stale 登录(token 过期)→ 点登录 → 应弹窗或自动重拉
- 网络挂了 → 点登录 → 应有错误提示
相关问题¶
- ISSUE-0002 — 同源问题(stale token),popup 那层 v0.10.16 已修;主面板 v0.10.17 修