# LionWebsite 一键登录指令方案(/login) 状态:待用户确认,未实施。 关联待办:`todos/open-td-20260921-a1b2c3-lionwebsite-login-tg.md`。 ## 1. 现状 - 个人面板入口是 `https://personal.lionwebsite.xyz/index`(桌面)与 `/mobile`(移动)。 nginx 把 `/` 代理到后端 `/personal/`,把 `/index`、`/mobile` 映射到静态入口文件。 - 面板没有登录页。`PrivateMain` 与 `PrivateMainForMobile` 的 `src/store/index.js` 把 `authCode: "alone"` 写死,所有请求都带 `?AuthCode=alone`。 - 后端 `PersonalInterceptor` 对 `/personal/**`、`/remote/**` 直接比较字面量 `alone`; `AdaptorFilter` 也用它决定移动端跳转。`/remote/**` 目前没有对应控制器,属历史遗留。 - `alone` 不在 `User` 表里(表内是 big lion / pubraseer / temp / au283602 / 0619 / liondown / bigcat)。它是独立的固定字面量:不轮换、不区分人,且随 JS 产物公开。 - 存储节点另有两处写死 `alone`:`storageNode` 的 `CustomUtil.java`(向 `/message2me` 推送)与 `MultiThreadedHTTPServer.java`(本机 HTTP 鉴权)。 - 机器人(QQ `LionQQBot` + Telegram `PersonalHub`,主机 vm103)目前没有 `/login`。 ## 2. 目标 1. 机器人在 QQ 与 Telegram 都能执行 `/login`,返回一条可点击的个人面板登录地址。 2. 地址自带短期凭证,点开即登录,不需要手输授权码。 3. 长期固定的 `alone` 不再出现在前端产物与聊天消息里。 4. 凭证可过期、可吊销,登录行为在后端留痕。 ## 3. 推荐方案:短期签名链接 + 会话 Cookie ### 3.1 后端(`lionwebsite-backend`,主机 us9929) 1. 新增登录端点。nginx 无需改动:`location /` 已把请求改写成 `/personal/...`, 因此 `https://personal.lionwebsite.xyz/login?t=...` 会落到后端 `/personal/login`。 - `GET /login?t=`:校验票据 → 下发 HttpOnly Cookie(`personal_session`, `SameSite=Lax`、`Secure`,有效期建议 30 天)→ 302 跳 `/index`。 - 票据格式建议 `v1.<签发时间戳>.`,有效期 5 分钟。 2. `PersonalInterceptor` 的放行条件改为「有效会话 Cookie **或** 合法 `AuthCode`」。 过渡期保留 `AuthCode`,避免影响下载器前端与存储节点推送。 3. `InterceptorConfiguration` 必须排除 `/personal/login`,否则登录端点会被自己拦住。 4. 共享密钥通过 `application.yaml` 的环境变量覆盖位注入(如 `personal.login-secret`), 密钥值不进仓库、不进日志。 5. 可选 `GET /login/logout` 清除 Cookie。 选签名票据而不是「后端签发一次性 token」的理由:机器人与后端之间不需要新增网络调用 和状态存储,双方共享一个密钥即可。代价是票据在 5 分钟窗口内可重放,对私聊场景可接受; 若要求真正一次性,改为后端 mint 端点 + 内存 token 表。 ### 3.2 机器人(QQ + Telegram,主机 vm103) - QQ:在 LionQQBot 插件里新增 `/login`(别名 `/登录`),复用既有命令注册与主人校验。 - Telegram:`sync_commands` 菜单增加 `/login`,`telegram.py` 派发到同名处理函数。 - 处理函数:用共享密钥生成票据,回复 `https://personal.lionwebsite.xyz/login?t=`,并附一句有效期提示。 - 密钥存 PersonalHub 秘密库,共享盘只保留 `secret://` 引用。 - 按现行约定,新增命令必须同时覆盖 QQ 与 Telegram,帮助菜单同步更新。 ### 3.3 前端(`PrivateMain` 桌面 / `PrivateMainForMobile` 移动) - 删除 `authCode: "alone"` 常量与 `?AuthCode=` 查询串,改为依赖同源 Cookie (axios 同源请求默认携带 Cookie)。 - 未登录或被拒时显示提示页「登录已过期,请在机器人里发送 /login」,不要静默失败。 - 下载器前端(`lionwebsite-frontend-desktop` / `-mobile`)使用每个用户自己的授权码, 本次不动。 ### 3.4 收尾:退役 `alone` - `PersonalInterceptor`、`AdaptorFilter` 不再比较字面量;移动端跳转改为原样透传查询串。 - 存储节点两处 `alone` 换成配置项,属 storageNode 仓库,单独一次发布。 - 轮换后确认无调用方仍依赖旧字面量。 ## 4. 更小的备选 - 方案 B(最小改动):前端增加「从 URL 读取 `AuthCode` 并记住」的逻辑,机器人 `/login` 直接回 `https://personal.lionwebsite.xyz/index?AuthCode=alone`。半天内可上线,但长期 密钥仍会进入聊天记录、浏览器历史与 nginx 日志,也没有解决 `alone` 写死的问题。 - 方案 C(只治理配置):把 `alone` 从代码搬到配置并轮换,机器人从配置读取。安全提升有限。 ## 5. 需要确认的三点 1. 采用推荐方案(Cookie 会话),还是先上备选 B? 2. 登录链接只允许主人使用,还是允许机器人给其他授权用户分别签发(对应 `User` 表账号)? 3. 会话有效期:建议 30 天滑动过期,可调整。 ## 6. 实施顺序 1. 后端票据签发与 Cookie 校验、拦截器放行,含单元测试。 2. 前端去掉 `alone`,补未登录提示。 3. 机器人 QQ 与 Telegram 双向 `/login`。 4. 存储节点两处 `alone` 改为配置。 5. 退役字面量 `alone`。