07-cockpit-api-auth-without-login.md 2.9 KB

Cockpit API auth without a login page

Type: grilling Status: resolved Labels: wayfinder:grilling Blocked by: None

进度:100%

原始鉴权决策已完成;本票在“驾驶舱真实后端数据接线”地图讨论中追加一次范围修订。当前有效结论见“决策修订”,原始事实与答案保留用于追溯。

后端事实(原始决策时只读核实)

来源:E:\pipe-ner-server\pipe-network-service。

  • 框架:Spring Security + JWT,SessionCreationPolicy.STATELESS,CSRF 已禁用。
  • REST 凭据:原实现的 TokenService.getToken() 从请求头读取,头名由 bootstrap.yaml 的 token.header 给出,值为 Authorization;Bearer 前缀会被剥离。
  • 原始安全配置:原实现的驾驶舱 REST 不在白名单,/api/cockpit/** 未认证时返回 401。
  • WebSocket:原实现的 /ws/deviceStatus 握手层可连接,客户端曾通过 authenticate 帧完成 JWT/Redis 校验;原 cockpitSubscribe 只校验 scope。
  • CORS:原实现未开启 allowCredentials,跨域 Cookie 会话不可行。

以上是原始决策建立时的事实,不代表本次修订后的目标安全配置已完成或已在目标环境验证。

Question

驾驶舱专用接口要求 isAuthenticated(),但首期明确不做登录页。原始候选是部署层注入 token、只走 mock,或为开发/生产分别配置凭据。

Answer

原始决策

原始结论是:默认 mock,real 显式开启;驾驶舱 REST 由部署层注入 Authorization: Bearer <JWT>;401 只标受影响分区为数据不可用;WebSocket 连接后先 authenticate 再 cockpitSubscribe;页面和 store 不接触凭据。

决策修订

根据“驾驶舱真实后端数据接线”地图中 #01 的确认,当前有效范围改为:

  • /api/cockpit/v1/** 内的驾驶舱只读 REST 接口不做鉴权。
  • /ws/deviceStatus 内的驾驶舱 WebSocket 不做鉴权,不要求 authenticate 帧。
  • 该免鉴权范围只覆盖驾驶舱只读链路;后端其他业务路径和未来写接口的安全策略不变。
  • 默认数据源仍是 mock,real 仍须由部署配置显式开启;失败、空态、字段缺失和断线的分区语义仍按各自领域契约处理,不回退 mock。
  • 票 25 承接后端实现与目标环境证据;在后端变更未提交、编译、测试并联调前,不宣称修订已部署生效。

本修订覆盖原答案中关于驾驶舱 REST Authorization 和 WS authenticate 的要求,但保留原始事实与决策历史。关联记录:报警—工单闭环读模型与 Gogs 票拆分边界、后端契约缺口待办。

状态

已解决(已修订)。 免鉴权的目标范围已确定,后端实现和真实部署证据仍属于后续执行工作。