Files
HomeAgent/cmd
JianFeeeee 60f51f40e0 fix(gui): 设备接口补设备令牌,设备页不再恒 401
## 现象
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 全绿。
2026-10-01 20:24:55 +08:00
..