跳到主要内容

API 对接

Dio、Bearer JWT、customServerUrl

约定

项位置 / 行为
Dio(业务)core/api/api_providers.dart
OpenAPI 生成core/api_client/(主);课程信息共享另用 packages/luotopia_course_api 生成客户端
珞家登录features/luotopia_auth/
认证头Authorization: Bearer <token>
客户端标识头X-App-Version(1.4.0+42)、X-App-Platform(android/ios/…);由 luotopiaClientIdentityInterceptor 连同版本化 User-Agent 一并打上
持有证明DPoP(RFC 9449):core/api/dpop_interceptor.dart 用设备密钥签发证明;登录/刷新时绑定令牌(cnf.jkt),后续请求证明持有;旧客户端无密钥则退化为普通 bearer
401refresh 后重试
426版本门禁拒绝:UpgradeGateInterceptor 触发 AppUpgradeGate.onUpgradeRequired,弹不可关闭的升级对话框
Deprecation/Sunset版本弃用公告:同上拦截器触发 onDeprecated,按 sunset 每周至多提示一次
自定义服务器开发者 customServerUrl
请求签名无 HMAC(个别校园第三方如座位预约另有 HMAC,与业务服务器无关);受保护操作经 Altcha 拦截器附带 X-Altcha 人机校验证明
官网 HTTPpackage:http(更新、热更新、友情链接等)

人机校验:core/api/altcha_interceptor.dart(AltchaInterceptor)在 luotopiaBaseDioProvider / 业务 Dio 上求解 Altcha 挑战并附带 X-Altcha(登录、注册、发邮件验证码等受保护操作)。这不是请求签名,见 服务端 · 人机校验。

版本门禁:core/api/upgrade_gate.dart(拦截器 + AppUpgradeGate 回调)监听服务端的 426/Deprecation 信号;UI 绑定在 features/app_update/presentation/upgrade_gate_binding.dart,由 AppUpdateStartupTask 在启动时安装(升级流程复用发布检查 + 安装器,426 期间发布接口走官网域名不受门禁影响)。服务端策略见 服务端 · 客户端版本兼容门禁。

服务端总览:API 使用指南。

Base URL

见 认证 · Base URL。业务 Dio 与官网 siteBaseUrl 分离。

接线示意

final baseUrl = devSettings.customServerUrl?.isNotEmpty == true
    ? devSettings.customServerUrl!
    : config.apiBaseUrl;

final dio = Dio(BaseOptions(baseUrl: baseUrl));
if (token != null) {
  dio.options.headers['Authorization'] = 'Bearer $token';
}
// QueuedInterceptor: 401 → refresh → 重试

安全边界

  1. 生产 HTTPS
  2. 用户 JWT + 服务端鉴权
  3. 教务 Cookie 只在 whu_auth

联调清单

  • /health 通
  • 开发者 URL = server.port
  • 登录后带 Bearer

相关