1.优化ws参数格式auth-token和user-token

This commit is contained in:
2026-05-27 10:57:52 +08:00
parent a96aa0fb41
commit b93940eaee
6 changed files with 147 additions and 35 deletions

View File

@@ -765,8 +765,8 @@
- **混合内容**:若 H5 页面为 **HTTPS**,浏览器要求 WebSocket 使用 **`wss://`**,否则会被拦截。
- **事件投递依赖 Redis**HTTP 侧业务通过 **`GameWebSocketEventBus`**Redis 列表)将事件投递到 WebSocket 进程Redis 不可用或队列异常时,**除 `admin.live.snapshot` 外**的广播类推送可能收不到。后台若订阅了 `admin.live.snapshot`,服务端有**每秒直连构建快照**的兜底,不依赖队列。
- **握手鉴权2026-05 重构后强制)**`GameWebSocketServer::onWebSocketConnect` 通过 `GameWebSocketAuthHelper::authorize` 校验 URL Query。两种合法身份
- **mobileH5/移动端)**:必须同时携带 `auth_token`(同 HTTP `auth-token`+ `user_token`(同 HTTP `user-token`,亦支持 `token` 同义)。校验通过后连接被绑定 `user_id`,分发器仅向其推送本人的 user 级主题。
- **admin后台/运维)**:必须携带 `admin_ws_token`(由后台 `wsConfig` 接口签发,写入 Redis Key `dfw:v1:ws:admin_token:{token}`,默认 TTL 7200s。后台已 `wsConfig` 中把该 token 拼到 `ws_url` 一并返回前端透传即可admin 模式 `user_id=0`,可订阅任意主题并收到**全量** user 级推送(运维联调用)
- **mobileH5/移动端)**:必须同时携带 Query **`auth-token`**、**`user-token`**(与 HTTP 请求头同名,**统一用连字符**)。校验通过后绑定 `user_id`,分发器仅向其推送本人的 user 级主题。服务端仍兼容旧别名 `auth_token` / `user_token` 解析,但**新接入请只用连字符**。
- **admin后台/运维)**:必须携带 Query **`admin-ws-token`**(由后台 `wsConfig` 签发,写入 Redis,默认 TTL 7200s`ws_url` 已自动拼接该参数admin 模式 `user_id=0`,可观测全量推送
- 任一身份不通过 → 服务端发送 `{"event":"ws.error","code":1101,"message":"Authentication failed: ..."}` 并立即 `close`
- **服务端按 user_id 过滤user 级主题)**:以下 topic 的 `data.user_id` 必须 **等于** 当前连接绑定的 `user_id` 才会下发——**`bet.win` / `user.streak` / `wallet.changed` / `bet.accepted` / `auto.spin.progress`**。其它 topic`period.tick` / `period.opened` / `jackpot.hit` / `admin.*`按订阅广播。admin 模式不参与此过滤。
- **心跳超时(服务端主动)**:连接 60s 内无任何上行报文(含 `ping`/`subscribe`)即被 server 主动 `close`,触发客户端走重连流程;避免半关闭的僵尸连接长期持有订阅却不能实际送达推送。
@@ -778,11 +778,11 @@
- **连接地址**:见 **§7.0**(环境变量 `H5_WEBSOCKET_URL` 或后台 `wsConfig` 返回的 `ws_url`
- **客户端**:浏览器原生 `WebSocket``ws://` / `wss://`
- **连接时必带 Query 参数2026-05 起强制)**
- **H5/移动端**`auth_token=<HTTP auth-token>` + `user_token=<HTTP user-token>`(亦支持 `token` 同义)。`device_id``lang` 仍可携带,但服务端不强制
- **后台**`admin_ws_token=<wsConfig 返回的 admin_ws_token>`后台 `wsConfig` 已直接把它拼到 `ws_url`,前端透传即可)。
- **H5/移动端**`auth-token=<HTTP auth-token 的值>` + `user-token=<HTTP user-token 的值>`。可选:`device_id``lang`
- **后台**`admin-ws-token=<wsConfig 返回的 admin-ws-token>`已拼入 `ws_url`)。
- 示例:
- H5`wss://ws.example.com/ws/?auth_token=xxx&user_token=yyy&device_id=ios_001&lang=zh`
- 后台:`wss://ws.example.com/ws/?admin_ws_token=zzz`
- H5`wss://ws.example.com/ws/?auth-token=xxx&user-token=yyy&device_id=ios_001&lang=zh`
- 后台:`wss://ws.example.com/ws/?admin-ws-token=zzz`
- 缺失任一必填字段或 token 失效 → 服务端回 `{"event":"ws.error","code":1101,...}` 后立即关闭连接。
- **连接成功首帧(当前实现)**
- `event``ws.connected`