mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-10-15 12:15:16 +00:00
## 现象
GUI 设备页长期空白。日志每 15s 一条:
GET 401 /api/v1/device/online
## 根因:/api/v1/device/ 命名空间下并存两套鉴权
· /device/gateway 注册在 webui 插件,走 requireAPI,认 session cookie
· /device/online、/device/、/device/push
注册在 remotedevice 插件,走 requireToken,
**只认 X-API-Key 头或 ?token=,完全不认 cookie**
实测可区分:cookie 401 与错 token 401 的响应体都是纯文本
"unauthorized",而 webui 鉴权返回 JSON {"error":...}。
所以 GUI 只带 cookie 时:gateway 200、online 401 —— 同一连接同一
时刻,现象自相矛盾。
## 三种能工作的客户端做法一致,GUI 两样都没做
· WebUI 浏览器:cookie 进内核,reverseToUpstream 注入
deviceGatewayToken(handler_device.go:118)
· waiter:客户端自己带 X-API-Key(gateway_discover.go:103)
· GUI:既没注入、也没自带 ⇒ 设备页恒 401,且异常被 catch
吞掉置空数组,界面与「确实没有设备」完全一样
## 改动
1) main.js:device-bridge:get 回传 token 明文(此前只有 tokenSet
布尔,渲染进程永远拿不到)。明文本就存在本机 gui-prefs.json,
不新增密钥存储面,且不落日志、不进 URL。
2) app.js:新增 isDeviceTokenPath / deviceApiKey,对设备接入面
端点附加 X-API-Key(优先连接自身 apiKey,退回设备桥 token)。
3) app.js:新增 ensureDeviceToken,并**在首次 /device/* 请求之前**
调用 —— 此前令牌加载排在 /device/online 之后,顺序正好反了。
4) app.js:401 时记下可读原因(deviceAuthHint),设备页顶部渲染
红色提示卡,不再把鉴权失败伪装成「没有设备」。
5) app.js:网关发现加缓存,并从每 15s 的 refreshAll 轮询里移出
(改为按需 + 切连接/手动刷新时重取)。网关地址是服务端配置的
慢变量,15s 拉一次没有意义;此前它与 online 同秒重复调用。
## 实测(本机 Electron,192.168.2.60:8080,真实凭据)
修复前:device/online 恒 401,设备列表空
修复后:device/gateway 1 次(之后走缓存)
device/online 每 15s,全部 200,返回 waiter-fnnas /
waiter-mainnas 两台设备
401 计数 0
判据:cmd/gui npm test 全绿。