本项目是一个基于 Flask 实现的双因素认证(2FA)系统。它提供用户注册、登录以及通过 Google Authenticator 或其他兼容 TOTP(基于时间的一次性密码)的应用进行 2FA 认证的功能。
- 后端: Python (Flask)
- 前端: HTML, JavaScript, DaisyUI (CSS 框架), Tailwind CSS (通过 DaisyUI 引入)
- 2FA 库:
pyotp用于生成和验证 TOTP - 二维码生成:
qrcode用于生成 2FA 设置二维码
main.py: Flask 后端应用的核心逻辑,包括路由定义、用户注册、登录和 2FA 验证。templates/index.html: 前端页面,包含用户注册和登录的表单以及显示 2FA 二维码的区域。.gitignore: Git 忽略文件配置。.python-version: Python 版本管理文件。pyproject.toml: Python 项目配置。uv.lock: 依赖锁定文件。README.md: 项目的 README 文件。
- 方法:
POST - 请求体:
JSON格式,包含username和password。 - 逻辑:
- 接收用户提供的用户名和密码。
- 使用
pyotp.random_base32()生成一个随机的 TOTP 密钥。 - 生成一个 TOTP provisioning URI (otpauth://) 用于 Google Authenticator。
- 使用
qrcode库将 provisioning URI 转换为二维码图像。 - 将二维码图像编码为 Base64 字符串,并作为数据 URI 返回给前端。
- 注册成功后,前端会显示该二维码供用户扫描。
- 响应:
JSON格式,包含status(0 为成功),msg和qrcode(Base64 编码的二维码数据 URI)。
- 方法:
POST - 请求体:
JSON格式,包含username,password和code(用户输入的 TOTP 验证码)。 - 逻辑:
- 接收用户提供的用户名、密码和 2FA 验证码。
- 验证用户名和密码是否与预设的
admin:admin匹配。 - 如果匹配,使用存储的 TOTP 密钥 (
data["secret"]) 创建pyotp.TOTP对象。 - 调用
totp.verify(code, valid_window=1)验证用户输入的验证码。valid_window=1表示允许当前时间戳前后各一个时间步的验证码。 - 根据验证结果返回登录成功或失败信息。
- 响应:
JSON格式,包含status(0 为成功) 和msg。
- 方法:
GET - 逻辑: 渲染
templates/index.html页面。
- UI 框架: DaisyUI (基于 Tailwind CSS)。
- 页面切换: 通过
tab_switchJavaScript 函数在注册和登录界面之间切换。 - 注册表单:
- 收集用户名、密码和确认密码。
- 客户端验证:检查用户名是否为空,两次密码是否一致。
- 通过
fetchAPI 向/register接口发送 POST 请求。 - 注册成功后,隐藏注册容器,显示二维码容器,并将返回的 Base64 二维码显示在
img标签中。
- 登录表单:
- 收集用户名、密码和 2FA 验证码。
- 客户端验证:检查用户名、密码和验证码是否为空,验证码长度是否为 6 位。
- 通过
fetchAPI 向/login接口发送 POST 请求。 - 根据服务器响应显示登录成功或失败的提示。
- 安装依赖:
pip install Flask pyotp qrcode Flask-Cors
- 运行应用:
应用将在
python main.py
http://127.0.0.1:5000上运行。
- 默认的用户名为
admin,密码为admin。 - 注册时生成的 TOTP 密钥是随机的,并且在后端
main.py的data字典中硬编码了一个示例密钥IM6YOMCQSOFLQLEGX3W5UEGGATZSDFKN。实际应用中应将密钥安全存储(例如数据库),并与特定用户关联。 - 本项目仅为演示目的,未实现用户数据持久化。