English | 中文
支持 Cloudflare Serverless 与 Docker 私有化部署的高安全、轻量级二步验证 (2FA/TOTP) 管理系统
💡 提示:演示站开启了全员登录模式,数据可随意修改、删除。正式部署请务必设置白名单。
不管是白嫖 Cloudflare 的免费额度,还是部署在自家的 NAS 或小主机上,2FAuth Worker 都能为你提供最安全、最便捷的 2FA 密钥管理体验。
- 白嫖党最爱:一键部署到 Cloudflare Workers,零成本、零维护、全球加速。
- 私有云极客:支持 Docker 部署,数据锁在自家硬盘里,局域网断网也能用。
- 沉浸式体验:支持安装到电脑桌面或手机主屏幕,没有浏览器边框的干扰。
- 断网也不怕:得益于先进的离线缓存技术,即便在地下室或飞机上(无网络),它依然能秒开并为你生成精准的验证码。
- 我们内置了智能安检逻辑。如果程序检测到关键密钥丢失或配置不当,它会立即“拉闸”阻断访问,防止你的数据因环境不安全而暴露。
- 支持 WebDAV、S3 云存储或 Telegram 机器人自动备份。即使手机丢了、系统重装了,甚至 Cloudflare 账号没了,你也能通过备份瞬间找回所有账号。
点击查看:同类型产品对比
| 功能特性 | 2FAuth Worker (本项目) | Google / MS Auth | Authy | 2FAS / Aegis | 1Password / Bitwarden |
|---|---|---|---|---|---|
| 数据所有权 | ✅ 完全掌控 (私有云/NAS) | ❌ 绑定大厂云端 | ❌ 锁定在厂商服务器 | ✅ 本地文件/私有云 | |
| 多端访问 | ✅ 网页+PWA (全平台) | ❌ 桌面端已关停 | ✅ 全平台支持 | ||
| 恢复便利性 | ✅ 多通道自动备份 (TG/S3) | ✅ 云同步 | ✅ 云同步 | ||
| 隐私保护 | ✅ 匿名部署,无追踪 | ✅ 无追踪 | ✅ 安全但目标较大 | ||
| 离线可用性 | ✅ 支持 (PWA 强力缓存) | ✅ 支持 | ✅ 支持 | ✅ 支持 | ✅ 支持 |
| 部署成本 | ✅ 0 成本 (CF Serverless) | ✅ 免费 | ✅ 免费 | ✅ 免费 | 💰 订阅/自建较重 |
| 厂商倒闭风险 | ✅ 源码在手,永不丧失 | 🚨 随时下线(如 PC 端) | ✅ 开源可控 |
🎯 小结:2FAuth Worker 既有 1Password 的多端便利,又有开源 App 的隐私性,更有 Serverless 的零成本。支持 Telegram 机器人自动备份更是解决了所有 Web 端和 App 端的“丢数据焦虑”,让安全触手可得。
这是最省心的方式,完全不需要自己的服务器,由 Cloudflare 免费为你托管。
- 在部署向导中,你需要授权 Cloudflare 读取该仓库(系统会自动在你的 GitHub 账号下创建一个私有克隆)。
ENCRYPTION_KEY:32位以上随机密钥。JWT_SECRET:32位以上随机JWT密钥。OAUTH_ALLOWED_USERS:你的邮箱@example.comOAUTH_GITHUB_CLIENT_ID:你的CLIENT_IDOAUTH_GITHUB_CLIENT_SECRET:你的CLIENT_SECRETOAUTH_GITHUB_REDIRECT_URI:你的回调地址
如果你想把数据完全掌控在自己手里,或者需要在内网环境运行。
在你的服务器上创建 docker-compose.yml:
services:
2fauth:
image: nap0o/2fauth-worker:latest
container_name: 2fauth-worker
ports:
- "3000:3000"
volumes:
- ./data:/app/data
environment:
- ENCRYPTION_KEY=32位以上随机密钥
- JWT_SECRET=32位以上随机JWT密钥
- OAUTH_ALLOWED_USERS=你的邮箱@example.com
# 至少配置一种登录方式 (以 GitHub 为例)
- OAUTH_GITHUB_CLIENT_ID=你的ID
- OAUTH_GITHUB_CLIENT_SECRET=你的Secret
- OAUTH_GITHUB_REDIRECT_URI=https://你的域名/oauth/callback
restart: unless-stopped运行 docker compose up -d 即可。
docker run -d --name 2fauth-worker \
-p 3000:3000 \
-v $(pwd)/data:/app/data \
-e ENCRYPTION_KEY=32位以上随机密钥 \
-e JWT_SECRET=32位以上随机JWT密钥 \
-e OAUTH_ALLOWED_USERS=你的邮箱 \
-e OAUTH_GITHUB_CLIENT_ID= \
-e OAUTH_GITHUB_CLIENT_SECRET= \
-e OAUTH_GITHUB_CLIENT_REDIRECT_URI= \
nap0o/2fauth-worker:latest 如果你想对代码进行持续部署,或者更精确地管理数据库,建议使用此方式。
- 在
存储和数据库->D1 SQL 数据库中创建一个名为2fauth-db的数据库,并记录其 Database ID。
- 在 Cloudflare 控制面板获取 API 令牌(需要
编辑 Cloudflare Workers权限)。
点击查看:获取 Cloudflare Worker 部署令牌的具体步骤
- 登录 Cloudflare Dashboard
- 前往获取 https://dash.cloudflare.com/profile/api-tokens
- 点击“创建令牌”
- 选择使用模版 “编辑 Cloudflare Workers”
- 配置“帐户资源”和“区域资源”
- 依次点击“继续以显示摘要”,点击“创建令牌”
- 复制生成的令牌
- Fork 本仓库到你的 GitHub 账号。
- 前往仓库的
Settings->Secrets and variables->Actions。 - 添加如下 Secrets:
CLOUDFLARE_ACCOUNT_ID:你的 CF 账户 ID。CLOUDFLARE_API_TOKEN:刚刚生成的 API 令牌。CLOUDFLARE_D1_DATABASE_ID:D1 数据库的 ID。CLOUDFLARE_D1_DATABASE_NAME:D1 数据库的名称。ENCRYPTION_KEY:32位以上随机密钥。JWT_SECRET:32位以上随机JWT密钥。OAUTH_ALLOWED_USERS:你的邮箱@example.comOAUTH_GITHUB_CLIENT_ID:你的IDOAUTH_GITHUB_CLIENT_SECRET:你的SecretOAUTH_GITHUB_REDIRECT_URI:你的回调地址
- 前往仓库的
Actions页面,手动运行Deploy to Cloudflare Workers工作流,或向main分支推送代码即可。
不论使用哪种方式部署,以下参数都非常重要:
| 变量名 | 作用 | 获取建议 |
|---|---|---|
ENCRYPTION_KEY |
核心: 数据库加密密钥 | 设好后绝对不要改!改了旧数据就解不开了。要求:32 位以上随机字符。 |
JWT_SECRET |
登录状态密钥 | 要求:32 位以上随机字符。 |
OAUTH_ALLOWED_USERS |
白名单: 只有谁能进 | 填你的邮箱或 Telegram 数字 ID,多个用逗号隔开。 |
| 平台 | 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 |
OAUTH_TELEGRAM_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) |
| 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 |
- 访问 GitHub
Settings->Developer Settings->OAuth Apps-> New OAuth App。 - 回调地址 (Callback URL) 必须填写:
https://你的域名/oauth/callback。 - 将
Client IDClient Secret和OAUTH_GITHUB_REDIRECT_URI填入环境变量。
-
在 Telegram 搜索并添加官方机器人 @BotFather,按照提示创建机器人。
-
记录生成的 Token (
OAUTH_TELEGRAM_BOT_TOKEN) 和 用户名 (OAUTH_TELEGRAM_BOT_NAME)。 -
请务必向 @BotFather 发送
/setdomain指令,选择您的机器人,并输入您的应用域名(不需要https://)。 -
由于本项目是 Serverless 架构,您需要手动注册 Webhook。
将下方链接中的<Token>和<域名>替换后,在浏览器中访问一次:
https://api.telegram.org/bot<Token>/setWebhook?url=https://<域名>/api/telegram/webhook -
将
OAUTH_TELEGRAM_BOT_TOKEN、OAUTH_TELEGRAM_BOT_NAME填入环境变量。
- 进入 Cloudflare Zero Trust Dashboard -> Access -> Applications。
- 创建一个 SaaS 应用 (Select "SaaS")。
- 配置 Application:
- 应用程序:
输入任意名称都行,如 2fauth - 选择身份验证协议:
OIDC - 重定向 URL:
https://你的域名/oauth/callback
- 应用程序:
- 复制保存关键信息备用,
客户端 ID和客户端密码。 - Access 策略 -> 点击创建新策略 -> 添加策略
- 策略:
Allow - 选择:
Everyone
- 策略:
- 其余均不需要额外配置,一直下一步到完成
- 将
OAUTH_CLOUDFLARE_CLIENT_ID、OAUTH_CLOUDFLARE_CLIENT_SECRET、OAUTH_CLOUDFLARE_REDIRECT_URI和OAUTH_CLOUDFLARE_ORG_DOMAIN填入环境变量。
为了保护您的账号安全,2FAuth Worker 在设计上采取了“多重锁死”策略:
- 静态数据全加密:数据库中存储的所有 TOTP 密钥种子(Secret)都经过 AES 高强度加密。即使数据库文件不幸泄露,黑客在没有
ENCRYPTION_KEY的情况下也无法获得原始密钥。 - 访问白名单制度:系统拒绝任何通过用户名/密码的传统注册。只有在
OAUTH_ALLOWED_USERS配置列表中的用户才能进入系统,拒绝任何陌生人蹭用。 - 智能环境感知 (Smart Shield):系统在启动和运行时会持续检查运行环境(如环境变量是否存在、数据库是否异常)。一旦发现异常,系统将拒绝生成任何验证码并进入保护模式。
- 端到端隔离:前端生成的敏感操作逻辑经过严格过滤,严禁任何 XSS (跨站脚本) 攻击。
- 隐私第一:本项目不包含任何追踪代码、分析工具或第三方统计插件。你的数据只属于你。
# 1. 克隆并安装依赖
git clone https://github.com/nap0o/2fauth-worker.git
cd 2fauth-worker
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本项目基于 GNU AGPL v3 协议开源。作为一款涉及 2FA 安全与网络服务的软件,我们坚持维护开源社区的公平性:如果您在服务器上运行本项目的修改版本并向公众提供服务,您必须向用户开放您的源代码。













