# 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 `;401 只标受影响分区为数据不可用;WebSocket 连接后先 authenticate 再 cockpitSubscribe;页面和 store 不接触凭据。 ### 决策修订 根据“驾驶舱真实后端数据接线”地图中 #01 的确认,当前有效范围改为: - `/api/cockpit/v1/**` 内的驾驶舱只读 REST 接口不做鉴权。 - `/ws/deviceStatus` 内的驾驶舱 WebSocket 不做鉴权,不要求 authenticate 帧。 - 该免鉴权范围只覆盖驾驶舱只读链路;后端其他业务路径和未来写接口的安全策略不变。 - 默认数据源仍是 mock,real 仍须由部署配置显式开启;失败、空态、字段缺失和断线的分区语义仍按各自领域契约处理,不回退 mock。 - 票 25 承接后端实现与目标环境证据;在后端变更未提交、编译、测试并联调前,不宣称修订已部署生效。 本修订覆盖原答案中关于驾驶舱 REST Authorization 和 WS authenticate 的要求,但保留原始事实与决策历史。关联记录:[报警—工单闭环读模型与 Gogs 票拆分边界](../../cockpit-real-data-wayfinding/issues/01-backend-slice-ticket-boundary.md)、[后端契约缺口待办](../../cockpit-shell-panel-layout/issues/25-backend-contract-gaps.md)。 ## 状态 **已解决(已修订)。** 免鉴权的目标范围已确定,后端实现和真实部署证据仍属于后续执行工作。