M4-T09: document login hardening, finalize OpenAPI and roadmap

This commit is contained in:
2026-06-21 23:01:50 +02:00
parent ee1264b66b
commit ae75e4582d
5 changed files with 289 additions and 115 deletions
+19 -1
View File
@@ -69,12 +69,30 @@ React SPA 前端(M2 引入)。Vite + React + TypeScript + Mantine,由 Fast
### `scripts/`
辅助脚本目录。当前包含 OpenAPI 导出脚本(`export_openapi.py`)与数据层辅助脚本。
辅助脚本目录。当前包含
- `export_openapi.py`:导出 OpenAPI schema 静态产物
- `run_migrations.py`:运行 Alembic migration
- `app_db_adopt.py`App DB 接管 / 初始化
- `migrate_legacy_data.py`:一次性历史数据搬迁脚本
- `admin_cli.py`Admin CLI 逃生通道(M4),见下方"登录加固"说明
### `openapi/`
OpenAPI schema 静态产物(`openapi.json` / `openapi.yaml`),由 `python scripts/export_openapi.py` 生成,纳入版本控制。前端 codegen 以此为契约源。
## 登录加固(M4
M4 在基础 Argon2 + server-side session 鉴权之上叠加了三层防御:
**防爆破 / 指数退避**`app/services/login_throttle.py` 按 client IP 与 username 双键记失败计数,失败超过 3 次后指数增长等待时间(最长 15 分钟),`POST /api/auth/login` 在退避窗口内直接返回 `429 + Retry-After`,不执行 Argon2 验证。成功登录后清零。退避是延迟而非永久封号;全局开关 `AUTH_LOGIN_THROTTLE_ENABLED`CONFIG_FIELDS,默认开);反代后需设 `AUTH_TRUST_FORWARDED_FOR=true``.env` 部署级,默认 false)。
**CLI 逃生通道**`scripts/admin_cli.py`(入口 `python -m scripts.admin_cli`)直连本地 DB,**无需 HTTP 服务运行、无需任何已存凭据**,支持:重置密码(`reset-password`)、解锁退避(`unlock`)、关停 TOTP`disable-totp`,零凭据最终逃生)、重新发放 TOTP secret`reissue-totp`)、查看用户列表(`list-admin`)。CLI 只动 auth 行,不触碰用户数据表。
**可选 TOTP 二次验证**:admin 可在设置页自选启用 RFC 6238 TOTP。启用后登录为两步(密码 → 6 位动态码或一次性恢复码);不启用维持纯密码。TOTP secret 明文存库(与其他 secret 一致,靠文件权限保护);恢复码以 Argon2 哈希存储,使用后消费(一次性)。后端使用 `pyotp`,二维码由前端 `qrcode.react` 渲染。issuer 标签由 `AUTH_TOTP_ISSUER``.env` 部署级)配置,默认回退 `app_name`
详细说明:[`docs/auth.md`](./auth.md)
## 当前约束
- 当前数据库继续使用 SQLite