diff --git a/docs/login-command-plan.md b/docs/login-command-plan.md index 89cf0aa..f0f229a 100644 --- a/docs/login-command-plan.md +++ b/docs/login-command-plan.md @@ -1,7 +1,10 @@ -# LionWebsite 一键登录(/login):实现说明与机器人侧待办 +# LionWebsite 一键登录(/login):实现说明 -状态:**主站侧已实施上线**(提交 `00e2715`);机器人侧(QQ / Telegram)**待实施**。 -关联待办:`todos/open-td-20260921-a1b2c3-lionwebsite-login-tg.md`。 +状态:**已全部完成并上线**。主站侧提交 `00e2715`(文档 `dfb647b`、`628f3ad`), +桌面端 `9b5bc94`;机器人侧由 `debian-qq-chatgpt` 于 host-vm103-debian-qq 完成 +(见共享盘 `tasks/2026-09-21-lionwebsite-login-bot-command/`)。 +关联待办:`td-20260921-a1b2c3`(已归档为 +`todos/archive/done-td-20260921-a1b2c3-lionwebsite-login-tg.md`)。 用户已明确选择**接法 B:共享密钥自签票据**,理由是机器人到主站的网络调用不可靠。 因此主站**不提供**任何票据签发端点,也不需要机器人侧发起 HTTP 请求——机器人本地 @@ -76,10 +79,16 @@ Shell 等价写法(`openssl`)供人工验证用: SIG=$(printf 'v1.%s' "$STAMP" | openssl dgst -sha256 -hmac "$SECRET" -hex | awk '{print $NF}') ``` -### 2.2 命令接入(主人已确认的方案) +### 2.2 命令接入(已实施:复用既有 `/login`) **复用既有 `/login`,不新建命令名;一条回复里同时给出两个登录链接。** +实现方式(vm103 实际做法,比原计划更稳):**机器人进程不持有密钥**。 +签发走保险库固定动作 `CollabSecretService.use_secret`,值只交给进程内签名函数, +不返回、不落盘、不进日志;审计只记引用与动作名 `lionwebsite-login-link`。 +QQ 侧 `plugins/login.py` 只经内部令牌 POST `/internal/panel-login`, +由 PersonalService 统一产出文案,因此 QQ 与 Telegram 不会漂移。 + - Telegram:`telegram_panel_login()` 的返回文案改为同时给出 PersonalHub 面板链接与 LionWebsite 面板链接,`TELEGRAM_COMMANDS` 里 `login` 的描述同步更新。 - QQ(LionQQBot):既有 `/login`(别名 `/登录`)返回同样两条链接,共用同一套生成逻辑。 @@ -106,7 +115,19 @@ PersonalHub 的 `/login` 原本只签发**它自己面板**的票据 (`OneTimePanelLoginTickets` + `/panel/telegram-login`)。改造时保留这条, 再在同一回复里附加 LionWebsite 链接;两者的票据机制与有效期互不影响。 -## 3. 可选收尾(未做,需要时另开任务) +## 3. 交付与复验 + +- 机器人侧提交状态:**两个机器人仓库的改动尚未提交 Git**(`v103` 侧待主人确认后 + 按项目约定提交,注意 PersonalHub 工作区另有前一轮未提交改动,勿混提)。 +- `us9929main-chatgpt` 的独立复验(2026-09-21): + - 票据边界实测:`now` 与 `now-290s` 放行,`now-301s`、`now-400s`、`now+60s` 均落 `/denied`; + 篡改签名与畸形串同样落 `/denied`。 + - 密钥明文扫描:抓取两个任务目录全部正文与线程消息共 17 KiB,未出现密钥明文, + 只有 4 处 `secret://` 引用。 + - 内部接口鉴权:`POST /internal/panel-login` 无令牌与错令牌均返回 403。 + - PersonalHub `/health` 返回 200;共享盘 waiting 指针已消费,队列已清空。 + +## 4. 可选收尾(未做,需要时另开任务) - 移动端 `PrivateMainForMobile` 仍写死 `authCode: "alone"`。后端两种方式都接受, 所以它能用;要一并切到会话,照搬 `PrivateMain/src/store/index.js` 的改法即可。