跳转至

title: [ISSUE-0001] 主面板「立即登录」按钮点击无反应 description: "点击登录也没有弹窗。我希望出现过的问题,以及改进方案都要做记录。" tags: [issue, auth] created: 2026-05-26 updated: 2026-05-26 type: issue status: fixed severity: critical


[ISSUE-0001] 主面板「立即登录」按钮点击无反应

相关 wikipopup-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-loginautoLoginViaCookies(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 同上(头像区登录按钮)

验证方式

  1. 卸载扩展或清除 storage(模拟干净状态)
  2. 在浏览器登录 web.laifaxin.com(让 cookie 在)
  3. 安装/重载扩展 → 应通过 cookie 自动登录,无需点
  4. 退出 web.laifaxin.com 但保留扩展里的 uid/token(模拟 stale)
  5. 重启浏览器 → 扩展 user API 失败 → 主面板显示「立即登录」
  6. 点击「立即登录」 → 应立即弹出登录窗口(修复前不会)

如何避免再犯

  • 「主动操作」与「静默尝试」必须区分:用户主动点击的入口(登录/重试/刷新)一定要 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 修