Files
lionwebsite-backend/docs/login-command-plan.md
T
root bee2f11fd6 移除文件管理与文件分享,接口范围收敛到订阅与用户管理
- 删除 /personal/files、uploadFile、private/**、compress、delete 与对应服务实现,
  连同压缩线程池、TAR 打包与 PersonalArchiveTest
- 删除 /personal/share、extendShareTime、cancelShare 与 /GetFile/{path},
  以及 ShareFile 实体、ShareFileMapper、PublicService.GetFile、每天四点的
  checkShareCode 定时任务和分享码失败黑名单
- CustomBean 去掉 ShareFile 的 Native 反射登记
- 同步收敛 PersonalServiceTest、PublicServiceTest、PersonalControllerTest、
  PublicControllerTest、LocalServiceTest 与三个画廊测试
- 文档同步,并附上 /login 方案 docs/login-command-plan.md

测试:mvn -o test 410 项通过
2026-09-21 10:02:07 +08:00

90 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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=<ticket>`:校验票据 → 下发 HttpOnly Cookie(`personal_session`,
`SameSite=Lax`、`Secure`,有效期建议 30 天)→ 302 跳 `/index`。
- 票据格式建议 `v1.<签发时间戳>.<HMAC-SHA256(共享密钥, 时间戳|用户)>`,有效期 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=<ticket>`,并附一句有效期提示。
- 密钥存 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`。