Skip to content

feat(auth): improve PIN autofill and password visibility - #146

Open
ShawnKung wants to merge 1 commit into
shaobeichen:mainfrom
ShawnKung:codex/auth-pin-password-manager
Open

ShawnKung wants to merge 1 commit into
shaobeichen:mainfrom
ShawnKung:codex/auth-pin-password-manager

Conversation

@ShawnKung

@ShawnKung ShawnKung commented Sep 28, 2026 •

Copy link
Copy Markdown

Summary

  • 根据访问 PIN 的生命周期设置对应的浏览器自动填充属性。
  • 为长期有效的 LAN、Named Tunnel 和自定义公网 PIN 启用密码管理器保存与填充。
  • 为登录页增加可访问的密码可见性切换。
  • 保留社区现有的 PIN 输入样式,并修正可见性控件加入后的文字、光标和焦点行为。

背景

当前 /pocket-login 登录页统一使用 autocomplete="one-time-code"。

这适合临时访问码,但不适合以下长期有效的凭据:

  • LAN PIN:持续有效,直到用户主动刷新。
  • Named Tunnel 公网 PIN:隧道重启时不会自动轮换。
  • 自定义公网 PIN:Quick Tunnel 重新开启时也不会自动轮换。

这些 PIN 更接近普通登录密码。统一使用 one-time-code 会影响 Chrome 等浏览器保存和填充长期凭据。

登录页此前也无法切换密码可见性,较长的自定义 PIN 输入错误时不容易检查。

凭据分类

新增 credentialKindForHost(host),根据 Host 和当前配置返回:

  • persistent
    • LAN PIN
    • Named Tunnel 公网 PIN
    • 自定义的 Quick Tunnel 公网 PIN
  • ephemeral
    • Quick Tunnel 自动生成并随隧道开启而轮换的公网 PIN

代理通过可选的 auth.getCredentialKind(host) 获取分类。

没有提供该回调时默认按 ephemeral 处理,避免现有调用方意外启用密码保存。

自动填充行为

长期凭据使用 autocomplete="current-password",并提供隐藏且稳定的 autocomplete="username" 字段,帮助密码管理器识别只有密码的登录表单。

Quick Tunnel 自动随机 PIN 使用 autocomplete="off",避免浏览器保存很快就会失效的随机 PIN。

密码可见性

登录页增加原生 type="button" 可见性控件:

  • 支持在隐藏和明文状态之间切换。
  • 动态更新 aria-label、aria-pressed 和 title。
  • 指针操作不会抢走输入框焦点。
  • 切换时保留光标和选区。
  • 控件状态变化不会触发表单提交。
  • Enter 键提交登录表单的行为保持不变。

输入框样式

可见性控件加入后,输入框左右对称预留空间,避免文字和光标被单侧内边距推偏。

同时关闭自动大写和拼写检查,避免密码显示为明文时被浏览器修改或参与拼写检查。

兼容性

  • 登录 POST 字段仍为 token。
  • Cookie、认证比较、限速和重定向流程不变。
  • PIN 文件格式和轮换规则不变。
  • 默认 8 位随机 PIN 行为不变。
  • 现有调用方不需要提供 getCredentialKind。
  • 不改变 HTTP 或 HTTPS 部署方式。

Test plan

  • npm test
  • 179 项测试全部通过。
  • LAN PIN 输出 autocomplete="current-password"。
  • Quick Tunnel 自动 PIN 输出 autocomplete="off"。
  • Named Tunnel 和自定义公网 PIN 被分类为长期凭据。
  • 固定 PIN 表单包含稳定的隐藏 username。
  • 可见性控件不会提交表单。
  • 使用真实 Chromium 验证隐藏、明文和再次隐藏的完整切换。
  • 切换前后输入框焦点和光标位置保持不变。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant