Files

4.1 KiB
Raw Permalink Blame History

MeBox Mobile API 接入与部署说明

更新日期:2026-10-17
适用版本:后端 feature/android-mobile-api 分支;App 0.1.0(versionCode 1)。

1. 路径与版本

  • 安卓契约挂载在 /api/v1,与既有 /api、Emby/Jellyfin 入口并行。
  • 健康检查:GET /api/health。
  • 实例身份:GET /api/v1/server-info(匿名,Cache-Control: no-store)。
  • 契约字段与错误码见同目录 openapi.yaml。

server-info.capabilities 必须反映真实运行能力。当前分支只有 device_sessions=true;播放会话、阅读 v1 进度、批量正文与移动端转码仍为 false,App 不得据此进入对应流程。

2. 连接与传输安全

  • 公网必须使用 HTTPS;App 默认使用系统信任链,不提供全局跳过证书校验。
  • 局域网 HTTP 需要用户在 App 内明确确认风险;App 只对当前配置的服务器来源 使用明文,不会把 MeBox Authorization 发往其它主机。
  • 首版只支持根路径部署。https://host/mebox 这类子路径会被 App 明确拒绝, 不会静默截断为根路径。
  • 反代需要保留 X-Request-ID(可选);服务端会回传同值或新生成值,用于 日志对账。

3. 反向代理检查项

以下项用于媒体阶段(M3/M4)回归,当前登录闭环不依赖它们,但仍建议提前配置:

项目 要求
Range / 206 透传客户端 Range,不要缓存完整响应后改写状态码
流式响应 关闭代理缓冲(如 nginx proxy_buffering off)
HLS .m3u8 与分片路径不要被改写或强制压缩
WebSocket 升级头透传,读超时大于心跳间隔
超时 登录/普通 API 30 秒内完成;转码起播超时单独配置

目前只验证了普通 JSON 端点;上表其余项尚未在本分支验收。

4. 认证与会话

  • POST /api/v1/auth/login 创建 auth_sessions 记录,访问令牌 JWT 增加 sid。
  • 旧 /api 中间件同样校验 sid:设备被踢出或退出后,未过期的 JWT 也会立即 返回 401,不能借旧入口绕过。
  • 没有 sid 的历史令牌继续按原逻辑访问旧 API;v1 认证端点拒绝这类令牌, App 需要重新登录。
  • POST /api/v1/auth/logout 幂等;会话撤销会同时撤销其名下刷新令牌。
  • 设备管理中的踢出操作会同步撤销该设备认证会话。

刷新轮换边界

  • 同一个刷新令牌的并发请求共享一次轮换;60 秒宽限期内重复提交返回同一结果。
  • 轮换结果仍保存在进程内。若新令牌已签发、旧令牌已撤销,但客户端没收到响应 且服务器随后重启,旧令牌可能无法恢复;此时 App 应要求重新登录。首版接受 该边界,未实现持久化幂等轮换。
  • 会话被撤销时,刷新返回 401 SESSION_REVOKED,优先于宽限期复用。

5. 错误契约

统一响应:

{
  "code": "SESSION_REVOKED",
  "message": "auth session revoked or expired",
  "request_id": "8a3bade4-cbb3-485b-8e34-2471e4940fc3",
  "retryable": false
}
  • 401 由 code 区分 TOKEN_EXPIRED、SESSION_REVOKED、INVALID_CREDENTIALS。
  • 403 表示权限或账号状态,不触发刷新。
  • 429 带 Retry-After,客户端必须等待。
  • 5xx / SERVICE_UNAVAILABLE / retryable=true 表示可安全重试。

6. 数据迁移与回滚

  • 新表 auth_sessions 与 refresh_tokens.auth_session_id 由现有 AutoMigrate 创建,属于增量变更,不清库。
  • SQLite 已验证;PostgreSQL 迁移需要在有实例的环境中单独执行 go test ./internal/database ./internal/repository -count=1 后才能宣称通过。
  • 回滚到旧版本不会删除新表;旧程序忽略新增字段。回滚前应先确认不需要再 依赖 sid 即时撤销能力。

7. 已知限制

  • 单实例部署;未实现多副本共享会话。
  • 外部播放令牌尚未继承 sid(属于 M3 播放会话范围),当前不能按设备即时撤销。
  • 反代子路径、自签名证书信任、多服务器配置均未支持。
  • App 目前只开放连接、登录、会话恢复与退出;媒体与阅读入口未实现。