Repository navigation
v1.11.0
v1.11.0:多设备同时修改不再丢失数据
同时修改的保护
此前多台设备或多个标签页同时新增、编辑或删除账户时,两次修改可能都提示成功,实际只保存下其中一次;同时推进同一个 HOTP 计数器,也可能拿到相同的验证码。原因是 Workers KV 是最终一致的存储,同时进行的修改会读到同一份旧数据并互相覆盖。
- 读写账户和 HOTP 计数器的请求现在都交给 Durable Object
SecretsStore依次处理,包括列表、新增、编辑、删除、批量导入、推进计数器、手动备份和恢复备份。 - 账户数据仍完整保存在
SECRETS_KV中,SecretsStore只保留最近一次写入的副本,并把每次写入同步到 KV。 - 新增的绑定
SECRETS_STORE使用 SQLite 存储后端,Workers 免费计划可用,由wrangler.toml中的迁移在部署时自动创建。 - 修改无法送达
SecretsStore时,返回“无法确认本次修改是否已保存,请刷新后重试”,不会悄悄丢失;读取则直接读 KV。 - 没有这个绑定时(例如把
worker.js直接粘贴到 Dashboard),应用照常可用,但只有同一个实例收到的请求会依次处理,多台设备同时修改时仍可能丢失其中一次。
网页与部署改进
- 页面无法显示的账户,例如恢复备份时原样保留、OTP 参数不受支持的条目,现在可以在列表上方的提示中展开,查看名称、账户和原因,并在确认后逐条删除。
- 开启智能聚合后,如果没有任何服务拥有两个及以上账户,不再只显示一个“其他服务”标题。
- 每日定时任务会清理不再被任何账户使用的 HOTP 计数器记录。删除账户时,即使计数器记录没有删掉,也不再返回 500,由下次清理处理。
- 设置了代理环境变量时,本地执行
npm run deploy不再因为 Wrangler 输出的代理提示而报“无法核对已有 KV”。 - 修正德语和意大利语中“收起”的翻译。
一键部署仓库的升级入口
一键部署导入仓库时不会复制 .github/workflows,所以这类仓库里没有 Sync Upstream 工作流。现在提供一个十几行的短入口 .github/sync-upstream-entry.yml,由它调用上游的 Sync Upstream 工作流,以后不用再更新。升级指南给出了预先填好内容的 GitHub“新建文件”链接,把其中的 OWNER/REPO 换成自己的仓库,打开后提交即可。
一键部署表单还会额外创建一个 KV 命名空间(默认名为 2fa),它不会被绑定。Worker 实际使用首次部署时创建的 <Worker 名称>-secrets-kv。删除空的命名空间前,请按部署指南确认数据在哪一个里。
浏览器扩展 1.2.0
本次附带的 Chrome、Edge、Firefox 扩展版本为 1.2.0,与主程序独立编号。
- 新增 Firefox Android 支持(153 及以上)。Edge Android 和 Firefox Android 的触控界面随屏幕调整,按钮更大。
- “记住账户”和“在此页面自动填充”合并为“以后在此网站自动填入 某账户”:勾选后点击“填充”,会记住该账户,并在同一次点击中请求此网站的访问权限,允许后开启此网站的自动填充。自动填充仍不会默认开启。
- 自动填充改为按网站授权,覆盖同一网站的所有页面;HTTP 页面(包括内网地址)现在也可以开启。旧版本的页面授权保持原样,不会自动扩大。
- 新增 PayPal、AWS、OpenAI 等 25 个常见服务官方登录页的账户匹配。
- 改进验证码框识别,更好地区分短信、邮件验证码与验证器验证码;不会再向已离开或已关闭的页面填入验证码。
详见扩展 1.2.0 更新说明。各浏览器商店上架 1.2.0 之前,可以下载本页附件手动安装。
文档
- 14 种语言的 README 移到了
docs/<语言代码>/README.md,例如英文版为docs/en/README.md。原来的README_EN.md等链接已失效。 - 开发指南和 API 参考删除了项目并不支持的 Steam 验证码,以及计划中的 Webhook、GraphQL 占位说明。
升级方法
⚠️ 部署生效的前后各约一分钟内,不要修改账户:不要新增、编辑、删除或导入账户,也不要复制 HOTP 验证码。新版本切换时会从SECRETS_KV接手数据,而刚写入 KV 的修改可能要约一分钟才能在各地读到;这段时间内的修改,可能覆盖掉切换前一刻的那次修改。
- 升级前导出数据备份,并确认已妥善保存原
ENCRYPTION_KEY。 - 一键部署用户:仓库里还没有 Sync Upstream 时,先按升级指南补上入口。然后打开 Actions → Sync Upstream → Run workflow,选择上游
main或本次发布标签v1.11.0。工作流会带入SECRETS_STORE绑定和创建它的迁移,无需手动操作。 - 命令行部署用户:先提交或用
git stash暂存本地改动,执行git pull后用git diff ORIG_HEAD HEAD -- wrangler.toml查看本次拉取带来的配置变化(只运行git diff wrangler.toml看不到上游的变化),确认保留了上游新增的SECRETS_STORE绑定和[[migrations]];用过git stash的再执行git stash pop,然后执行npm install和npm run deploy。 - 部署完成后稍等约一分钟,刷新网页,确认显示
1.11.0。
升级继续使用现有的 Worker、KV 和密钥,不需要删除或重建实例。已在测试账号上验证 v0.1.0 至 v1.10.0 的各个版本升级到本版本:账户、HOTP 计数器、升级前的登录状态和旧备份都保持不变。
回滚限制
1.11.0 起部署会创建 Durable Object SecretsStore,而 Cloudflare 不允许跨越 Durable Object 类的变更回滚,所以 Dashboard 的 Deployments 页面无法回到 1.11.0 之前的版本。
需要回滚时,按回滚到 1.11.0 之前的版本用命令行部署旧版本,并在旧版本的 wrangler.toml 末尾加上删除这个类的迁移 rollback-1;之后再升级时追加 restore-1。账户数据始终完整保存在 SECRETS_KV 中,回滚不会丢失账户。回滚和再次升级时,同样请在切换前后各约一分钟内不要修改账户。
发布附件
worker.js、worker.metadata.json 和 DEPLOY.md 用于单文件 Worker 部署和版本核对。直接粘贴 worker.js 部署不会创建 SECRETS_STORE,同时修改的保护只在同一个实例内生效,见上文。另附扩展 1.2.0 的安装包,可下载后自行安装。所有附件均从 v1.11.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 安装包与商店版是同一个附加组件,临时载入后,在浏览器重启前会代替商店版。