dsh-pairing-gateway: DSH Frontend QR Code Pairing Authentication Gateway

前言

把 DeepSeek Harness(DSH)暴露到局域网或公网时,若仍依赖 dsh 自身入口,往往缺少「设备级」第二因素:谁从哪台终端进来、凭证变更后如何一次性作废所有会话,都需要额外设计。社区插件 dsh-pairing-gate(维护者 chjy090)在 dsh 前面加一道独立 HTTP/HTTPS 网关:TOTP 授权的扫码设备配对、用户名密码登录、通过后反代 dsh(含 WebSocket)。它与同名但功能不同的 TecFancy/dsh-auth-gate(密码/共享令牌 + 用户管理 CLI)不是同一套方案;npm 包名为 dsh-pairing-gate,本地插件目录名仍为 dsh-auth-gate。

下面介绍其定位、能力与安装用法;事实以仓库 README 与 package.json(当前版本 0.7.5,MIT 许可证)为准。

这是什么

dsh-pairing-gate 是 DSH 的 admin-security 类前台认证网关插件:在默认 127.0.0.1:3443 上监听,校验网关会话后把流量反代到本机 dsh(默认 http://127.0.0.1:3080)。目标模型是「单人自用」的 设备绑定即第二因素——已配对设备只需用户名 + 密码;新设备须先经 6 位 TOTP 授权生成配对二维码或链接。未通过网关认证的浏览器看不到 dsh 的 launch token,也拿不到 dsh 会话 cookie。

状态与密钥落在 dsh 状态目录下 $DSH_HOME/auth-gate/...;未设置 DSH_HOME 时回退到 ~/.dsh/auth-gate(含 admin.key、state.json、setup.token、network.json)。

核心功能

认证与配对

  1. 登录两要素:已配对设备 cookie(配对时由 6 位 TOTP 授权)+ 用户名密码(scrypt)。正常登录不填 TOTP;未配对设备返回 device_required。
  2. 新设备:管理页输入当前 6 位 TOTP 生成一次性配对二维码/链接(票据在 URL fragment,默认 120 秒;服务端只存 SHA-256)。
  3. 改密码 / 重置 TOTP 需当前密码,并会撤销全部设备与会话,所有终端需重新配对。
  4. 可选 Android 客户端 DSH-Mobile 扫码配对与设备令牌续期;App 扫码只接受 https 配对 URL。

会话与设备

  • 滑动窗口 + 绝对上限:默认设备 deviceTtlDays: 90、deviceAbsoluteTtlDays: 365;Web 会话 sessionTtlHours: 48、sessionAbsoluteTtlDays: 30(配置见 profile 内完整 override)。
  • 默认最多 100 台设备;可单独吊销,吊销会级联删除该设备全部会话。
  • 同一客户端可用 clientDeviceId 重复配对,仍只占一条设备记录。

管理与网络

  • Web 管理页 /__admin:账号、配对码、设备与会话、审计(API 最近 100 条)、网络设置。
  • dsh 侧边栏「认证管理」原生 React 面板(非 iframe):配对二维码、改密、重置 TOTP、设备/会话表格等;从 3080 直连时仅提示跳转 3443。
  • 管理页可改 监听地址/端口、publicUrl(生成配对链接)、publicFingerprint(前置代理 TLS 时证书 pinning);覆盖写入 $DSH_HOME/auth-gate/network.json,监听支持热重建。
  • loopback 安全:管理页/network.json 禁止 loopback 监听地址;网关实际绑定 loopback 时会禁用「本机 loopback 即管理员」通道,仅保留 adminKey 与会话。

反代与安全细节

  • HTTP(S) 与 WebSocket 反代;Host/Origin 改写、注入 dsh 会话 cookie、上游 401 自动刷新 cookie 重试一次。
  • 限流:登录失败 15 分钟内 5 次锁 15 分钟;配对/续期、QR 签发等按 IP 限流(详见 README)。
  • 网关是 dsh 前面的第二道门;能直连 3080 的人仍可能看到 dsh 自身登录入口,生产环境建议用防火墙限制 3080。

安装与启用

dsh plugin add 会自动注入 auth-gate,安装命令以 README 为准,不要重复写 insert:。

  1. 进入插件目录安装 npm 依赖(含 qrcode),再用 link 或 git URL 加入 profile web,最后重启 dsh:
cd $PLUGIN_DIR && npm install --no-audit --no-fund   # 首次安装 qrcode 依赖
dsh plugin --profile web add link:$PLUGIN_DIR        # 也可以是一个 git URL
systemctl restart dsh
  1. 改配置应在 profile 的 cordis.patch.yml 里对 id: auth-gate 做 整体 override(Cordis 对 config 整体替换,需写全字段,可复制仓库内 config.example.json)。不要直接改插件包内的 cordis.patch.yml,升级会覆盖。

典型用法:首次初始化与本机试用

仓库默认是可移植的本机 HTTP:127.0.0.1:3443 反代 127.0.0.1:3080,适合首装试用,不要直接暴露到公网。

  1. 启动后若未初始化,日志会出现一次性 setup 链接,也可读 setup.token:
auth-gate: setup required — open http://127.0.0.1:3443/__admin#setup=<token>

未设置 DSH_HOME 时 token 文件路径为 ~/.dsh/auth-gate/setup.token。在本机浏览器打开 http://127.0.0.1:3443/__admin#setup=<token>,按向导创建管理员、绑定 TOTP;完成后当前浏览器即被配对。

  1. 查日志示例:
journalctl -u dsh -n 200 --no-pager | grep 'setup required'
  1. 跨机 / 公网 / App 配对必须先改配置:网关需配置 tlsCert/tlsKey,且 publicUrl 与 TLS 一致(配 TLS 则 publicUrl 必须为 https:;未配 TLS 则必须为 http:)。App 无法用「代理终止 TLS + 明文回源 + 网关不配证书」的组合配对。两种常见拓扑:网关自身终止 TLS,或 Caddy/Nginx 对外终止 TLS 且 HTTPS 回源到网关(网关仍要自签证书等)。详见 README「快速开始」第 4–5 条与 docs/installation.md。

请求路径概览:

手机 / 浏览器 ──HTTP/HTTPS(:3443)──> dsh-pairing-gate
    ├─ /__auth/*   登录、配对、续期、登出
    ├─ /__admin*   管理页与 API
    └─ 其它路径 → 校验会话 → 反代 dsh(含 WS)

适用场景与注意

适合:单人或小规模自用,希望「可信设备 + 密码」访问 dsh,并需要 Web 管理、可选移动端扫码、frp 等场景下可配置 publicUrl / 证书指纹。

务必注意:

  • 插件以 当前 dsh 进程权限 运行;安装前请自行审阅 GitHub 源码 与 MIT 许可证。
  • 默认配置仅适合本机试用;生产、跨机、App 配对需按文档配置 LAN 监听、TLS 与 https:// 的 publicUrl。
  • 社区目录 SkillHub 插件页 与 GitHub 为独立生态信息源,与 DeepSeek / 幻方无官方从属关系;DSH 理念是「一切皆插件」,选型以仓库文档为准。

结尾

dsh-pairing-gate 把 TOTP 授权的扫码配对、滑动会话与 dsh 反代收进一个可配置的网关层,适合在暴露 DSH 前补上设备级第二因素。进一步了解可查阅 SkillHub 目录页 与 GitHub 仓库 README。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye