【实战记录】基于 Cloudflare Workers 搭建个人专属 2FA 验证码服务
前言
我一直想把 2FA 验证码从“单手机绑定”改成“浏览器可访问”的方式。
原因很现实:手机丢了、坏了或重置了,验证码可能直接断档。与其被动补救,不如提前把服务搭在自己可控的云端。
最终我选了开源项目 2fa-authenticator,底层是 Cloudflare Workers + KV:
- 轻量省心:部署简单,免费额度对个人使用足够。
- 数据可控:密钥存在自己的 KV,不依赖第三方托管平台。
- 跨端可用:浏览器可登录查看,设备切换更从容。
官方有一键部署入口,但实际操作里有几个容易踩的坑。下面按顺序把可复用的流程写清楚。
准备工作
- GitHub 账号(用于创建和管理仓库)
- Cloudflare 账号(用于部署 Workers 与管理 KV)
Step 1:发起一键部署(先别急着点到底)
- 打开项目仓库:
zhifu1996/2fa-authenticator - 点击 README 里的 Deploy to Cloudflare Workers
- 授权 GitHub 后会进入部署配置页面
注意:到这一步先停一下,先做 Step 2 的配置,再点击最终 Deploy。否则大概率会直接报错。
Step 2:先做两项关键配置

这是成败分水岭,建议逐项确认。
2.1 勾选创建新仓库
- 配置项:
Create new repository - 原因:后续若要改配置(例如
wrangler.toml),必须有自己的仓库才能快速修复并自动触发重部署。
2.2 手动填写 Build Command
常见问题是构建命令为空,导致 Worker 找不到前端静态资源,出现类似:
assets.directory ... does not exist
建议填写:
cd web && npm install && npm run buildBuild output directory 则确认指向构建产物目录(通常是 web/dist,以项目实际配置为准)。
配置完成后再点击 Deploy。
Step 3:处理域名路由报错(Fatal Error)

如果你看到类似错误:
[ERROR] Could not find zone for '2fa.xxxx.eu.org'
基本可以确定是仓库里写了作者自己的路由配置,而你的账号并不拥有该域名。
处理方式:
- 进入刚创建的 GitHub 仓库
- 打开根目录
wrangler.toml - 删除底部
[[routes]]相关配置(包含pattern、custom_domain等) - 提交变更
Cloudflare 检测到提交后会自动重新部署,通常这一步就能恢复为 Success。
Step 4:启用 workers.dev 访问地址
部署成功后,如果你发现没有可访问链接,可以手动开启:
- Cloudflare Dashboard → Workers & Pages → 进入项目
- Settings → Triggers
- 在
workers.dev区域点击 Enable
启用后会得到一个形如:
https://your-project.your-name.workers.dev 的访问地址。
Step 5:配置管理员密码
默认不设置管理员变量,你将无法进入管理页添加 2FA 条目。
配置路径:
- 项目页面 → Settings → Variables and Secrets
- 新增变量:
Name:ADMIN_PASSWORDType:SecretValue: 你的高强度密码
- 保存并重新部署
使用建议
- 首次登录:访问你的 workers.dev 地址,点击“管理”,输入管理员密码。
- 备份策略:定期导出 2FA Secret 作为离线备份,避免单点故障。
- 进一步加固:可以叠加 Cloudflare Access(Zero Trust)再做一层身份验证。
结语
Cloudflare Workers + KV 很适合这类“轻量、低频、重可用”的个人工具。
把 2FA 放到自己可控的服务里,不是为了“折腾”,而是为了在设备出问题时,仍然有稳定的恢复路径。
如果你也在做图床、短链、Webhook 网关之类的小服务,这套部署思路同样可以直接复用。
部分内容可能已过时