dsh-web-startup-auth:让 DSH Web 界面安全暴露在局域网

前言

用 DSH(DeepSeek Harness)做智能体开发时,dsh web 会在本机启动浏览器界面。若想在局域网另一台设备上打开同一界面,需要把服务绑定到 0.0.0.0。原版 @deepseek-ai/dsh-web-app/startup 出于安全考虑会硬拒绝 --host 0.0.0.0,远程访问这条路被堵死。

下面介绍社区插件 dsh-web-startup-auth:它替换原版启动器,并配套用户名/密码认证,使 dsh web --host 0.0.0.0 在局域网场景下可用。

这是什么

dsh-web-startup-auth 由 GDWhisper 维护,归类为 DSH 社区目录中的「联网工具」插件。它是一个 DSH bundle:安装后通过 cordis.patch.yml 自动补丁原版启动逻辑,无需手动改配置文件。

一句话定位:远程 Web 启动 + 用户名/密码认证,让 DSH 浏览器界面可以在非回环接口上暴露,同时用会话保护 API。

核心功能

远程启动

允许使用 --host 0.0.0.0,替代原版启动器对该参数的硬性拒绝。

登录与注册

首次访问引导设置管理员账号密码,之后进入登录页;界面风格与 DSH 黑白蓝主题一致。登录后下发签名 cookie dsh_sid(14 天有效,HttpOnly + SameSite=Lax)。

API 保护

/api/auth/*/login 外,所有 /api/* 路由及第三方插件 RPC 路由必须携带有效会话,否则返回 401 或拒绝握手。

设置面板

向 DSH 设置面板注入「认证」标签页,提供退出登录与修改密码。独立入口 /api/auth/logout 可清除会话 cookie。

远程场景修复

针对局域网 HTTP 访问的两个问题做了修补:

  1. crypto.randomUUID polyfill——非安全上下文下该 API 缺失会导致 RPC 失败。
  2. 特权 API 回环放行——DSH 将 settings.*credentials.* 等敏感域、authority: "loopback" 的第三方 RPC channel 以及 WebSocket 事件流限制为仅回环 Host 可访问;认证通过后本插件以回环身份放行。

上游兼容(dsh ≥ rc.8)

远程浏览器访问时,设置面板依赖的前端 settings mirror 原本会报 settings are unavailable in this browser。本插件通过 webServer.tapIndex 注入脚本,在 connection 插件激活时将 connection.isLoopback 覆盖为恒 true,使 mirror 与配置 scope 以 host 模式创建,无需刷新页面。

安装与启用

本插件是 DSH bundle,package.jsondsh.bundle.patch 声明了随包分发的 cordis.patch.yml。用 dsh plugin 安装后,包会加入 profile 的 dsh.profile.bundles,补丁层自动生效。

从 npm registry 安装(当前版本 0.1.2):

dsh plugin --profile web add dsh-web-startup-auth@latest

从源码安装:

git clone https://github.com/GDWhisper/dsh-web-startup-auth
cd dsh-web-startup-auth
npm install
npm run build
dsh plugin --profile web add .

dsh plugin 是 pnpm 转发器,--profile <name> 必填;add . 会把当前目录以 link: 方式装进 profile。

启动服务:

dsh web --host 0.0.0.0

安装时已自动应用补丁,无需再用 --patch 叠加——重复叠加会把插件再插入一遍。

典型用法

  1. 浏览器访问 http://<主机IP>:<端口>/
  2. 首次访问跳转到 /login,显示「设置管理员账号密码」注册表单。
  3. 注册成功后自动登录进入主界面;之后访问需登录。
  4. 退出登录或修改密码:主界面设置面板 → 认证标签页。

凭据与会话密钥保存在 ~/.dsh/web-auth.json

  • 密码使用 scrypt(随机盐,64 字节)散列存储。
  • 会话 cookie 用随机密钥做 HMAC-SHA256 签名。

忘记密码时,在服务器本机执行:

dsh --profile web auth-reset

非交互方式:

dsh --profile web auth-reset --password <新密码>

重置会轮换会话密钥,作废所有已签发的会话。兜底方案是删除 ~/.dsh/web-auth.json 并重启,可重新注册(同样作废所有会话,但需重启服务)。

适用场景与注意

适合谁:需要在局域网内用手机、平板或另一台电脑访问 DSH Web 界面的开发者;需要在可信内网共享 DSH 会话的场景。

安全边界(来自 README 安全说明):

  • 本插件提供认证,不提供传输加密。明文 HTTP 下凭据与流量可被同网抓包,建议仅在可信内网使用,或在前方部署 HTTPS 反向代理。
  • 会话 14 天有效;dsh_sid 是自包含签名 cookie,泄露后 14 天内无法单独吊销。auth-reset 或设置面板「修改密码」会轮换会话密钥,一次性作废全部会话。
  • 凭据未设置时任何访问者都可注册为管理员。在把服务暴露到不可信网络之前,请先完成首次注册。
  • 登录失败按客户端 IP 限速:连续 5 次失败锁定 30 秒(纯内存、无持久化);注册要求密码至少 8 个字符。
  • --trusted-host 仅为与原版 CLI 兼容而保留透传,不参与本插件认证判断——远程客户端一律需要有效会话。
  • 插件以当前 dsh 进程权限运行;安装前应检查源码与许可证(MIT)。

链接

  • 社区目录页:https://www.skillhub.cn/plugins/GDWhisper/dsh-web-startup-auth
  • GitHub 仓库:https://github.com/GDWhisper/dsh-web-startup-auth
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜