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

5.2 KiB
Raw Blame History

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.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。