M4-T09: document login hardening, finalize OpenAPI and roadmap
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user