From 962ba26c7c22202154e5902d3d70eb55e861b2f7 Mon Sep 17 00:00:00 2001 From: Tianyu Liu Date: Sat, 13 Jun 2026 15:29:20 +0200 Subject: [PATCH] =?UTF-8?q?docs(roadmap):=20add=20Future=20Ideas=20?= =?UTF-8?q?=E2=80=94=20TOTP=202FA=20for=20the=20public=20dashboard?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Record TOTP (RFC 6238) as a deferred hardening idea for the now public-facing Web dashboard: second factor on the single-admin login, with CLI-only password reset and a CLI TOTP reset/recovery path that works even if the recovery codes are lost (no lock-out dead end). Not M2.5, not scheduled — parked under a new Future Ideas section. --- docs/roadmap.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/roadmap.md b/docs/roadmap.md index 5bca937..62f65e8 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -148,3 +148,23 @@ - 移动端是这一阶段最远期、最不确定的部分。 - token 主要是移动端的前置条件;Web 端 React 用现有 session cookie 即可,不需要为它提前引入 token。 + +## Future Ideas(暂不排期,想到先记下) + +> 这里收集**还没排进里程碑**的想法。不是承诺、也没有先后顺序;想做时再从这里捞出来细化成 `docs/design/` 的任务卡。**明确不开 M2.5**——下列条目一律先躺在 Future Ideas,之后再说。 + +### TOTP 二次验证(Dashboard 加固) + +**动机**:M2 之后多了一个 Web Dashboard。它虽有单 admin 密码保护,但**大概率会暴露在公网**上,只靠密码这一层不够。给登录再叠一层 **TOTP(基于时间的一次性密码,RFC 6238)** 作为第二因子,做纵深防御。 + +**范围(粗略,待细化)**: + +- 在现有单 admin(Argon2 + server-side session)登录之上,叠加 TOTP 第二步:密码校验通过后再验 6 位动态码,通过才发 session cookie。 +- 首次启用时生成 TOTP secret,给出可导入 Authenticator 的二维码 / 可手输密钥;同时生成一组一次性**恢复码(recovery codes)**。 + +**运维 / 命令行要求(关键,实现时必须满足)**: + +1. **忘记密码**:不需要任何 Web 端“找回密码”流程——直接在命令行里重置 admin 密码即可(沿用现有 CLI 思路)。 +2. **TOTP 重置 / 恢复**:必须提供**命令行重置入口**。要覆盖最坏情况——**连恢复码(restore key)都丢了**,也能纯靠 CLI 把 TOTP 关掉 / 重新发放新的 secret,从而恢复登录。即:**CLI 是不依赖任何已存恢复凭据的最终逃生通道**,不能出现“密钥丢了就彻底锁死”的死角。 + +**先不做**:本条仅记入 Future Ideas,不进 M2.5、不排期;之后再细化为 design 任务卡。