dsh-lan-web-auth
dsh host plugin: crypto.randomUUID polyfill + password auth for the web GUI on LAN (non-secure-context) browsers
安装
此插件尚未提供可验证的 bundle,或兼容性检查未通过。请先阅读仓库说明。 阅读完整 README ↗
说明文档
阅读完整 README ↗dsh-lan-web-auth
English | 简体中文
面向 DeepSeek Harness(dsh --profile web)的宿主插件:让浏览器 GUI 能在局域网中正常使用,并加上密码保护。包含两个功能:
-
crypto.randomUUIDpolyfill —— GUI 的 RPC 客户端用crypto.randomUUID()生成请求 id,而浏览器只在安全上下文(HTTPS 或回环地址)中暴露该 API。纯 HTTP 的局域网来源(192.168.x.x、主机名、ZeroTier IP)不是安全上下文,因此每次/api调用都会在客户端直接抛错(crypto.randomUUID is not a function):会话列表永远加载不出来、工作区基线永远不就绪,界面一直停在"选择工作区"。polyfill 基于crypto.getRandomValues实现——它在非安全上下文中可用。 -
密码鉴权 —— 对页面 fallback、
/api前缀路由、以及两个 WebSocket 下行通道(/api/events.mux、/api/events.host)统一做 cookie 校验。未登录的访客会看到内置登录页;向POST /api/auth/login提交正确密码后种下 HttpOnly cookie(30 天有效)。回环来源(127.0.0.1/localhost/::1)默认免密(config.loopbackExempt)。
安全与风险
在把 GUI 暴露到本机之外之前,请先读完本节。dsh web 是一个远程控制面:harness 可以执行 shell 命令、读写文件、管理凭据与设置,因此"认证成功(或被绕过)"等价于以你的用户身份远程执行代码。
- 明文 HTTP、无 TLS。 密码、会话 cookie 和全部对话内容都以明文传输。任何能嗅探网段的人(例如开放 Wi-Fi、被攻破的 AP/路由器)都可以截获密码或劫持会话。在不可信网络上,请把 dsh 放到 TLS 反向代理后面,或只通过加密隧道(ZeroTier / Tailscale / WireGuard)访问。
- 无暴力破解防护。 登录端点没有限速或锁定机制,弱密码可以被猜出。请使用长、随机、不与其他账号重复的密码。
- 密码明文存储。
config.password明文保存在~/.dsh/profiles/web/cordis.patch.yml中;改用DSH_WEB_PASSWORD环境变量时,密码也会出现在进程环境里。任何拥有本机读取权限的人都能拿到。不要把真实密码提交进 git(示例 patch 用的是占位符)。 - 回环免密是一个真实缺口。
loopbackExempt: true(默认)时,本机任何进程——不只是你的浏览器——只要连得上127.0.0.1:3080就完全绕过密码,因为它可以发送回环Host头,而 DNS-rebinding 栅栏约束不了非浏览器客户端。不信任本机进程时请设loopbackExempt: false,让回环访问也要求密码。 - 无状态 token、无法吊销。 会话 token 是密码的 SHA-256 哈希;改密码是吊销已有 cookie 的唯一手段。cookie 有效期 30 天。
- 绑定
0.0.0.0会扩大暴露面。 示例 patch 监听所有网卡,机器挂载的每个网络(Wi-Fi、ZeroTier、TUN 虚拟网卡……)都能访问 GUI。在不完全信任的网络上,请只绑定具体接口(例如host: '192.168.1.13')。 - 鉴权是附加层,不是安全边界。 本插件的密码门禁叠加在内置浏览器信任栅栏(Host/Origin 校验)之上,是家用/局域网场景的便利层,不能替代 HTTPS + 真正的认证。如果威胁模型重要,请在 dsh 前面架设正规反向代理。
- Workaround,可能与上游冲突。 本插件绕过了上游的缺口(非安全上下文下缺少
crypto.randomUUID;无内置认证)。如果未来某个 dsh 版本修复了其中任意一项,升级前请评估是否还需要本插件。
安装
-
把包复制进 web profile 的 node_modules:
~/.dsh/profiles/web/node_modules/dsh-lan-web-auth/(或者作为插件安装:在
~/.dsh/profiles/web/package.json的 dependencies 中加入"dsh-lan-web-auth": "file:",然后运行dsh plugin --profile web install。) -
在用户 patch 层
~/.dsh/profiles/web/cordis.patch.yml中加入对应行——完整的局域网配置(绑定0.0.0.0、信任主机名、插件行)见 patch.example.yml。patch 层是用户自有的扩展点:npm i -g @deepseek-ai/dsh升级不会覆盖它。 -
重启
dsh --profile web(或让用户 patch 监视器热加载)。
配置
| 字段 | 含义 |
|---|---|
password | 登录密码。缺省时回退到 DSH_WEB_PASSWORD 环境变量。两者都没有时鉴权保持关闭(仅 polyfill),并输出警告日志。 |
loopbackExempt | 为 true(默认)时,回环来源跳过密码。 |
在 patch 中修改 config.password 会通过 HMR 即时生效;局域网客户端需要重新登录。
备注
- token 是密码的 SHA-256——无状态,重启不失效。
- 鉴权叠加在内置 DNS-rebinding / 浏览器信任栅栏之上,栅栏仍然生效。
- 插件代码改动需要重启 dsh(loader 按进程缓存模块);配置改动热生效。
- patch.example.yml 中的 webserver 行监听所有接口(
0.0.0.0),让局域网/ZeroTier 设备能访问 GUI;connection行把主机名加入信任栅栏。