2FAuth Worker
基于 Cloudflare Workers + D1 的新型 Serverless 二步验证 (2FA/TOTP) 管理器
Demo演示 https://2fa.nezha.pp.ua
- 演示站配置了
OAUTH_ALLOW_ALL=true变量, 默认允许任何用户登录,正常部署切记 不要主动配置OAUTH_ALLOW_ALL变量 | 不要主动配置OAUTH_ALLOW_ALL变量 | 不要主动配置OAUTH_ALLOW_ALL变量 - 演示站数据可以任意修改、删除
2FAuth Worker 是一个安全、轻量级、无服务器的 TOTP 二步验证管理工具。它让你完全掌控自己的 2FA 数据,支持多端跨平台使用,无需购买任何服务器,完全免费部署在 Cloudflare 边缘网络上。
✨ 核心优势与功能
🌩️ 真正的 Serverless 架构
- 零成本运维:由 Cloudflare Workers 处理后端逻辑,Cloudflare D1 (SQLite) 存储数据,完全抛弃传统服务器。
- 全球边缘加速:应用直接运行在 Cloudflare 全球数百个数据中心,极速响应。
📱 渐进式 Web 应用 (PWA)
- 安装如原生应用:完美支持 PWA,你可以将 2FAuth 直接安装到电脑桌面或手机主屏幕,享受无浏览器边框的沉浸沉浸式极致体验。
- 真正的离线可用:支持基于 Service Worker 的深度离线缓存,即使在断网、无信号的极端环境下,应用依然能秒开并为你生成准确无误的动态验证码。
🔐 极简却强大的身份验证
- 抛弃传统的账密注册,全面拥抱 OAuth 2.0 第三方登录。
- 支持对接:GitHub, Google, Telegram, Cloudflare Access (Zero Trust), Gitee, NodeLoc。
- 支持基于邮箱/用户名的硬核白名单控制,谢绝任何陌生人访问你的 2FA 数据库。
🛡️ 固若金汤的数据安全
- 私有数据库:你的验证器密钥永远只存在于你的私有 D1 数据库中。
- 高强度加密存储:数据库中的 TOTP Secret 强制进行 AES 加密存储。
- 加密导出:支持标准 JSON、2FAS 以及采用 AES-GCM 高强度加密打包的定制导出格式。
🧰 全能的实用工具箱
除了 2FA 管理外,系统原生内置了多款高频安全工具:
- 🔑 高强度密码生成器
- ⏳ 时间校准器 (精准检测并解决 TOTP 失效的时钟偏移问题)
- 📷 二维码解析提取器
- 🛡️ TOTP 密钥分析与生成工具
🔄 企业级数据灾备
- WebDAV / S3 / Telegram 自动备份:连接你的Nextcloud、阿里云 OSS 或 AWS S3,或者 Telegram Bot。
- 自动化定时任务(Cron Triggers)实现无感数据双重灾备。
🚀 详细部署指南
本项目支持 2 种部署方式:一键部署到 Cloudflare Workers 和 通过 GitHub Actions 部署。请根据你的需要选择其中一种即可。
方式一:一键部署到 Cloudflare Workers(推荐,新手友好)
这是最简便的部署方式,只需点击下方按钮,按照页面向导提示操作即可快速上线。
部署说明:
- 在部署之前,建议你先准备好你打算使用的第三方登录(OAuth)配置,例如 GitHub 的 Client ID / Secret(详见下文:获取第三方登录密钥)。
- Fork 本仓库
- 点击上方的 Deploy to Cloudflare Workers 按钮进入 Cloudflare 部署向导。
- 根据向导提示,授权 Cloudflare 读取该仓库(系统会自动在你的 GitHub 账号下创建一个该项目的私有克隆)。
授权 Cloudflare 读取 Github 仓库 步骤:
- 点击
创建和部署,完成部署! - 访问专属的
xxx.workers.dev域名,按照页面提示完成初始化配置。
方式二:通过 GitHub Actions 自动化部署(适合高级用户)
如果你需要更深入定制或打算持续集成,可以选择原生的 GitHub Actions 自动部署流程。
1. 准备工作
- 注册一个 Cloudflare 账号。
- Fork 本仓库到你的 GitHub 账户。
2. 获取 Cloudflare Worker部署令牌
- 登录 Cloudflare Dashboard
- 前往获取 https://dash.cloudflare.com/profile/api-tokens
- 点击“创建令牌”
- 选择使用模版 “编辑 Cloudflare Workers”
- 配置“帐户资源”和“区域资源”
- 依次点击“继续以显示摘要”,点击“创建令牌”
- 复制生成的令牌
3. 配置 Cloudflare D1 数据库
- 登录 Cloudflare Dashboard。
- 依次点击左侧菜单的 存储和数据库 -> D1 SQL 数据库。
- 点击 创建数据库,命名为
2fauth-db(或自定义名称)。 - 创建成功后,复制数据库详情页提供的
Database ID,备用。
4. 配置 GitHub Actions Secrets
前往你 Fork 仓库的 Settings -> Secrets and variables -> Actions -> New repository secret,添加下列关键参数:
- 基础平台令牌必填:
CLOUDFLARE_ACCOUNT_ID:你的 CF 账户 ID (CF 面板的概述页右下角可以找到)CLOUDFLARE_API_TOKEN:刚刚在“步骤 2”获取的部署令牌CLOUDFLARE_D1_DATABASE_ID:刚刚在“步骤 3”获取的 D1 数据库 IDCLOUDFLARE_D1_DATABASE_NAME:默认为2fauth-db
- 系统安全与 OAuth 登录密钥:
ENCRYPTION_KEY、JWT_SECRET及你要使用的 OAuth 登录配置,请统一查阅下方的 🧩 通用环境变量配置说明 进行添加。
5. 触发自动化部署
- 进入你的 GitHub 仓库的 Actions 页面。
- 找到
Deploy to Cloudflare Workers工作流。 - 点击 Run workflow 手动触发执行(或者随便 Push 一下 main 分支)。
- 等待自动化脚本完成,部署成功后,控制台会输出你的
xxx.workers.dev访问链接。 - 访问专属的
xxx.workers.dev域名,按照页面提示完成初始化配置。
手动触发deploy
配置Secrets and variables示例
🧩 通用环境变量配置说明
以下环境变量,不论是通过 "方案一:一键部署" 还是 "方案二:GitHub Actions",都需要在Worker设置页面或仓库 Secrets 中按需配置:
1. 核心安全参数(必填!)
⚠️ 高危警告:关于 ENCRYPTION_KEY 的修改风险
ENCRYPTION_KEY是用于加密数据库中 2FA 核心令牌种子的底层主密钥。一旦系统投入生产使用并存入数据,请绝对不要再修改此环境变量的值! 如果该密钥丢失或更改,数据库里旧的数据将无法解密!
| 变量 / Secret Name | 说明 | 示例值 |
|---|---|---|
ENCRYPTION_KEY |
对数据库持久化2FA核心密种加密的主密钥 | 必填。建议使用 openssl rand -hex 32 生成,务必自己保存好备份。 |
JWT_SECRET |
签发安全会话状态的系统密钥 | 必填。越长越好, 建议输入 32 位随机字符。 |
OAUTH_ALLOWED_USERS |
允许登录系统的白名单:支持填入邮箱,或 Telegram数字ID | 必填。me@example.com,you@example.com,5341743823 (多个配置必须用逗号分隔) |
2. 配置第三方登录
系统支持多种登录方式,你至少需要选择一种进行环境配置。我们最推荐使用 GitHub 作为后台登录。
使用 GitHub 登录获取办法
- 访问 GitHub
Settings->Developer Settings->OAuth Apps-> New OAuth App。 - 填写应用信息:
- 名称:
2FAuth Worker - Homepage URL: 填入你预期的站点域名,例如
https://2fa.yourdomain.workers.dev(部署后可绑定自定义域名) - Authorization callback URL: 必须填写
https://<你的Homepage URL>/oauth/callback
- 名称:
- 保存并复制生成的
Client ID和Client Secret。
使用 Telegram 登录获取办法
- 在 Telegram 中搜索并添加官方机器人 @BotFather。
- 发送
/newbot指令,按照提示为你的 2FAuth 创建机器人,记录它的Bot Token(如123456:ABC-DEF1234...)。 - 记录机器人的
Bot Name(也就是你刚设置的以 bot 结尾的用户名,例如my_2fa_bot) - (非常重要)发送
/setdomain指令,选择此机器人,然后发送你的应用域名(不需要https://,例如:2fa.yourdomain.workers.dev)。 - (非常重要)由于我们要使用无服务器直接验证,需要配置 Webhook,复制下方链接在浏览器中访问一次注册 Webhook:
https://api.telegram.org/bot<你的BotToken>/setWebhook?url=https://<你的应用域名>/api/telegram/webhook
依据你选取的登录平台填入所需变量(任选一对即可):
如果你使用 GitHub 登录,就在环境变量里配置 GitHub 那一行提供的所有变量选项。其它平台类似。
| 平台 | Client ID 变量群 | Client Secret 变量群 | Redirect URI 回调变量群 (示例:https://xxx.dev/oauth/callback) |
|---|---|---|---|
| GitHub | OAUTH_GITHUB_CLIENT_ID |
OAUTH_GITHUB_CLIENT_SECRET |
OAUTH_GITHUB_REDIRECT_URI |
| Telegram | OAUTH_TELEGRAM_BOT_NAME(填你的Bot名称) |
OAUTH_TELEGRAM_BOT_TOKEN(填Bot的Token密钥) |
Telegram 无需 URI 回调变量 |
OAUTH_GOOGLE_CLIENT_ID |
OAUTH_GOOGLE_CLIENT_SECRET |
OAUTH_GOOGLE_REDIRECT_URI |
|
| Cloudflare Access | OAUTH_CLOUDFLARE_CLIENT_ID |
OAUTH_CLOUDFLARE_CLIENT_SECRET |
OAUTH_CLOUDFLARE_REDIRECT_URI(该平台还缺一不可:需额外配置 OAUTH_CLOUDFLARE_ORG_DOMAIN,如: https://<team>.cloudflareaccess.com) |
| Gitee | OAUTH_GITEE_CLIENT_ID |
OAUTH_GITEE_CLIENT_SECRET |
OAUTH_GITEE_REDIRECT_URI |
| NodeLoc | OAUTH_NODELOC_CLIENT_ID |
OAUTH_NODELOC_CLIENT_SECRET |
OAUTH_NODELOC_REDIRECT_URI |
💻 本地极客开发 (Local Development)
如果你想自己修改 UI 或增加功能,可以很方便地在本地把跑起来(需要 Node.js 20+):
git clone https://github.com/nap0o/2fauth-worker.git
cd 2fauth-worker
# 1. 给前后端分别安装依赖
npm install
# 2.复制 example.dev.vars 为 .dev.vars, 按说明写入开发用的测试密钥
cp example.dev.vars .dev.vars
# 3. 初始化本地的 SQLite Sandbox 数据库
npx wrangler d1 execute 2fauth-db-dev --local --env dev --file=backend/schema.sql
# 4. 终端启动应用
npm run dev
🏗️ 全栈项目架构
本项目遵循现代化的 Feature-based 垂直模块化架构:
- Frontend (Vue 3 + Vite):完全模块化,包含
vault(账户管理),backup(云端灾备),auth(身份验证),tools(工具箱) 等独立领域模块。状态管理由 Pinia 驱动。 - Backend (Hono.js):极其轻量的边缘框架。配合
Drizzle ORM丝滑读写 D1 数据库。 - 前后端天然一体:由单代码库 (Monorepo) 管理,GitHub Actions 一次触发,同时构建前端产物并以
Asset/SPA模式挂载至 Worker。
🛡️ 安全性声明 (Security Policy)
本项目涉及高度敏感的 2FA 认证种子数据的云端存储,在架构安全方面我们做出了如下强制约束:
- 密钥隔离设计:
JWT_SECRET(用于签发 Session/Device Token) 与ENCRYPTION_KEY(用于静态加密数据库的核心密码) 必须从 Cloudflare 环境变量层面强制分离,不要设置相同变量值。任何ENCRYPTION_KEY缺失导致的系统空缺都会被高危拦截拒绝启动,从而遏制降级攻击。 - 零容忍 XSS (跨站脚本) 防御策略:本项目的前端严格禁止任何未经深度转义的动态 HTML(
v-html或等效方法)直接上树。任何第三方代码引入必须经过人工审计。
遇到任何安全性相关的 Issue,请在提交时标记为 [Security] 以获得最高优的处理优先级。
📄 License
本项目基于 MIT License 协议完全开源。你可以自由地二次开发、分发或商业使用,只要包含原作者和版权声明即可。