Repository navigation
v1.12.0
v1.12.0:立即创建备份、功能模块离线可用与安全加固
新功能
- 备份对话框新增“立即创建备份”按钮,可以随时手动创建一份备份,完成后提示结果并刷新备份列表。备份列表还在加载时创建的备份,也会在刷新后立即显示,不再被较早返回的空列表挡住。
- 导入、导出、扫描二维码、备份、工具和 Google 迁移等功能模块,联网打开过一次后会保存在 Service Worker 缓存中,离线时也能使用。新版本生效时,旧版本的缓存随之删除。
安全改进
- 限流改为按操作分别计数。此前除导出外,各项受限操作共用同一个按 IP 的计数,一分钟内删除 5 个账户或保存 5 次设置,接下来的登录就会返回 429。各操作的限额不变。
- 主页面和
/setup页面不再允许被其他网站嵌入框架(frame-ancestors 'none'、X-Frame-Options: DENY)。如果你把 2FA 页面嵌在其他网页的 iframe 中(例如导航面板),升级后将无法显示,请改为直接打开。 - 二维码库 jsQR 和 qrcode-generator 从 CDN 加载时校验 SHA-384 摘要(子资源完整性),文件被改动时浏览器会拒绝执行。
- 请求日志不再记录响应头中的
Set-Cookie。此前每次登录和刷新登录状态时,登录令牌都会写进 INFO 日志;设置了LOG_REMOTE_ENDPOINT时,还会发送到该地址。设置过远程日志的用户,建议升级后清理旧日志,并修改一次密码,修改密码会让之前签发的登录令牌全部失效。
问题修复
- 扫描
otpauth://hotp/二维码添加的账户此前一律保存为 TOTP,显示的验证码不对,现在按 HOTP 保存。批量导入不受影响。已经这样添加的账户,可以编辑后在“高级设置”中把类型改为 HOTP 并填写计数器,或删除后重新扫码。 - 预览、恢复或导出备份时,如果备份中有它自己没有记为跳过的无效条目(例如密钥不是有效的 Base32、otpauth 链接无法解析),此前会直接报“解析失败:备份包含无效密钥,已阻止生成”,TXT 备份中格式错误的链接甚至返回 500。现在这些条目会被跳过,并逐条列出位置和原因:预览标记为不完整,恢复和导出返回“备份不完整”,与其他跳过条目的规则相同。创建备份时仍然拒绝写入无效条目。
- OneDrive 和 Google Drive 表单中的“保存并授权”现在总是先保存表单。此前修改已有目标的名称或文件夹路径后点击它,修改会丢失。保存失败时不会开始授权;目标卡片上的“授权”或“重新授权”按钮仍然只授权,不保存表单。
- 离线时批量导入、Google 迁移导入和扫码添加账户,此前都提示导入成功,实际只是放进了本机队列。现在与离线新增、编辑账户一样,提示“操作已保存,网络恢复后自动同步”;中途暂停后继续导入的,结束时同样给出这一提示。
- 文件导入有失败条目时,会弹出“导入结果”逐条列出失败原因,不必再打开浏览器控制台查看。
部署与同步
- Sync Upstream 合并
wrangler.toml时,name、workers_dev、preview_urls、route和routes只在第一个表头之前读取和写入,表头按 TOML 规则识别。此前顶层没有routes时,会把[env.development]中的routes当成顶层配置,下次构建就把测试域名绑定到正式 Worker 上。如果你用过 Sync Upstream,并在[env.development]中写了routes,请检查正式 Worker 的域名绑定。 - 项目没有设置
keep_vars,只在 Dashboard 中添加的文本变量会在下次部署时被删除,包括 Sync Upstream 之后的 Git 构建。网盘配置指南改为要求把OAUTH_REDIRECT_BASE_URL写进wrangler.toml的[vars],或添加为 Secret。 - 回滚到 1.11.0 之前的版本补充了获取旧版本标签、把旧版
wrangler.toml指向正在运行的 Worker 和 KV 等步骤。一键部署用户不能用 Sync Upstream 选旧标签回滚,需要在本地克隆中回滚,期间断开 Git 构建,再次升级前把迁移加进仓库。
升级方法
- 升级前导出数据备份。
- 如果在 Dashboard 中把
OAUTH_REDIRECT_BASE_URL添加成了文本变量,先把它写进wrangler.toml的[vars]或改为 Secret,否则部署后它会被删除。删除后,网盘授权的回调地址会改用浏览器当前访问的地址,与网盘应用中登记的地址不一致时,授权会失败。 - 一键部署用户:打开 Actions → Sync Upstream → Run workflow,选择上游
main或本次发布标签v1.12.0。仓库里还没有 Sync Upstream 时,先按升级指南补上入口。 - 命令行部署用户:执行
git pull和npm install后,执行npm run deploy。 - 刷新网页,确认显示
1.12.0。
本版本没有新的 Durable Object 迁移,从 1.11.0 升级时 SecretsStore 继续使用原有数据。从 1.11.0 之前的版本升级,请先阅读 v1.11.0 的升级方法,切换前后各约一分钟内不要修改账户。
回滚
本版本与 1.11.0 使用相同的 Durable Object 迁移,可以在 Dashboard 的 Deployments 页面直接回滚到 1.11.0。回滚到 1.11.0 之前的版本,仍需按回滚指南添加 rollback-1 迁移。
浏览器扩展
扩展没有改动,版本仍为 1.2.0。
发布附件
worker.js、worker.metadata.json 和 DEPLOY.md 用于单文件 Worker 部署和版本核对。直接粘贴 worker.js 部署不会创建 SECRETS_STORE,同时修改的保护只在同一个实例内生效。另附扩展 1.2.0 的安装包,可下载后自行安装。所有附件均从 v1.12.0 标签源码构建。
2fa-extension-chrome-1.2.0.zip、2fa-extension-edge-1.2.0.zip:解压后,在chrome://extensions或edge://extensions打开“开发者模式”,点击“加载已解压的扩展程序”(Edge 为“加载解压缩的扩展”),选择解压出的文件夹,也就是直接包含manifest.json的那一层。之后不要删除或移动这个文件夹。2fa-extension-firefox-1.2.0.zip:未经 Mozilla 签名,正式版 Firefox 只能临时载入。打开about:debugging#/runtime/this-firefox,点击“临时载入附加组件”,直接选择这个 zip 文件;浏览器重启后需重新载入。长期使用或在 Android 上使用,请从 Firefox 附加组件商店安装。
手动安装的扩展不会自动更新,从商店安装可自动获得更新。Chrome / Edge 手动加载的扩展与商店版分别保存设置;Firefox 安装包与商店版是同一个附加组件,临时载入后,在浏览器重启前会代替商店版。