dsh-login-gate:为 DSH 网页入口加一道密码

前言

DeepSeek Harness(DSH)在本地或内网暴露 HTTP 监听时,默认依赖进程级 launch token(URL 里的 ?token=xxx):谁拿到完整链接,谁就能进控制台。对「只挡陌生人、仍要方便自己用」的场景,单靠 token 不够——你需要一层「人」的校验:密码、会话、失败限流,以及忘记密码时的可操作流程。

社区插件 dsh-login-gate(维护者 duwenlong2,分类 admin-security)面向上述缺口:装好后打开 DSH 先看到登录或首次设密页,输对密码才进入 Harness。密码用 scrypt 派生,状态文件经 Windows DPAPI 加密;不引入 TOTP 等第二因素,专注「网页暴露到公网要有一道门」这一件事。

这是什么

dsh-login-gate 是 DSH 的 Cordis 插件,给 web profile 的 HTTP 服务包一层门禁:每个请求先过插件,通过后再交给原有 handler。简介原文为:Password gate for the DSH web listener。

DSH 生态理念是「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。安装前请自行查看源码与许可证——插件以当前 DSH 进程权限运行。

核心功能

下面介绍 README 中已列出的能力,均可在仓库文档中核对。

能力 说明
首次访问引导 未设过密码时自动进入「设置密码」页,无需命令行
密码输入 输入框支持「显示」,便于核对
会话 默认 7 天;HttpOnly + SameSite=Lax;HTTPS 下 Cookie 自动 Secure
防爆破 每 IP 连续 5 次失败锁定 10 分钟(识别 CF-Connecting-IP)
忘记密码 登录页提供三步重置说明(PowerShell / cmd / 资源管理器)
安全存储 明文不落盘:scrypt + Windows DPAPI
初始化保护 第一次设密码仅允许本机(loopback 且无转发头),防公网抢注
设置面板 设置 → 访问门禁:改密码、调会话有效期、到期提醒、退出登录

工作原理(一句话):DSH 的 HTTP 服务按 exact / prefixes / upgrades / fallback 四张路由表分发;插件激活时把各 handler 包一层,未登录则 302 登录页或 401;/__auth/* 由插件自行处理;已登录则注入 cookie 并重写 Host 后交给原 handler。

与同生态 TecFancy/dsh-auth-gate 相比,本项目不引入 TOTP、共享令牌、用户管理 CLI,而把首次设密与忘记密码做成网页闭环。

安装与启用

需要 Windows 与 Node 20+。装完后重启 DSH 才生效。

方式一:插件中心(推荐)

设置 → 插件中心 → 添加插件 → 安装第三方插件
输入本地目录路径(或 GitHub 仓库地址)

支持 npm 包名、GitHub 仓库、本地目录三种来源;装完会自动写入 package.json 与 bundles。

方式二:命令行

先把插件装进 web profile:

dsh plugin --profile web add file:C:\path\to\dsh-login-gate

从 GitHub 安装:

dsh plugin --profile web add github:duwenlong2/dsh-login-gate

再编辑 %USERPROFILE%\.dsh\profiles\web\package.json,在 dsh.profile.bundles 中追加 dsh-login-gate,例如:

{
  "dsh": {
    "profile": {
      "bundles": [
        "@deepseek-ai/dsh-base",
        "@deepseek-ai/dsh-web-app",
        "dsh-login-gate"
      ]
    }
  }
}

重启 DSH 后访问 http://127.0.0.1:3080,应看到设置页或登录页。

典型用法

首次设置密码

  1. 打开 http://127.0.0.1:3080
  2. 自动进入「设置访问密码」
  3. 输入两次密码(可用「显示」核对)
  4. 点击「保存并进入」→ 自动登录并进入 Harness

从公网访问初始化会提示「只能在本机初始化」。

日常使用

场景 行为
打开 DSH 已登录直接进入;未登录跳转登录页
登录一次 默认 7 天内免重复输入
换设备或清 cookie 需重新登录
连续输错 5 次 锁定 10 分钟
主动退出 访问 /__auth/logout

设置面板

设置 → 访问门禁 可查看会话剩余天数(少于 2 天有提醒)、修改密码(改完后其他设备强制下线)、将会话有效期调整为 1–30 天、退出当前浏览器会话。改密码与有效期写回 %USERPROFILE%\.dsh\auth-gate.dat,一般无需重启;状态文件中的有效期会覆盖 cordis.patch.yml 里的 sessionDays。

忘记密码

密码无法找回,可删除状态文件后重新走首次设密。登录页底部「忘记密码?看这里」给出说明。任选其一:

资源管理器:地址栏输入 %USERPROFILE%\.dsh,删除 auth-gate.dat。

cmd:

del "%USERPROFILE%\.dsh\auth-gate.dat"

PowerShell:

Remove-Item "$env:USERPROFILE\.dsh\auth-gate.dat"

删完后刷新浏览器即可出现设置页,不必重启 DSH。

可选配置

在 cordis.patch.yml 中(改完需重启 DSH):

- id: auth-gate
  name: 'dsh-login-gate'
  config:
    allowLocal: false    # true = 本机免登录,只挡外网
    sessionDays: 7       # 会话有效期(天)
    maxFails: 5          # 连续失败次数
    lockMinutes: 10      # 锁定时长(分钟)
    title: 'DSH · 安全入口'

密码与派生数据存放在 %USERPROFILE%\.dsh\auth-gate.dat(DPAPI 加密的 JSON,含 scrypt hash、salt、会话 HMAC 密钥),绑定当前 Windows 用户;删除该文件等于清空所有设备会话。

适用场景与注意

适合:在 Windows 上跑 DSH web profile,监听可能经内网穿透或反向代理暴露到非完全可信网络,希望用单一密码 + 会话挡住未授权访问,且希望设密、改密、忘密都在浏览器内完成。

务必注意:

  • 仅支持 Windows(DPAPI);非 Windows 环境不适用。
  • 限流为进程内内存,重启 DSH 后计数清零。
  • README 写明实测兼容 @deepseek-ai/dsh-* 0.2.1-rc.2;依赖 webServer 路由表字段名,DSH 大版本升级后若字段变更,门禁可能静默失效,需自行验证。
  • 依赖 ~/.dsh/.credentials.yaml 的 browser-session secret 代签 cookie。
  • 卸载可在 设置 → 插件中心 → 已安装 操作,或 dsh plugin --profile web remove dsh-login-gate 并从 bundles 中移除;可选删除 auth-gate.dat。

插件以当前 dsh 进程权限运行;安装前请阅读仓库源码与 MIT 许可证,确认符合你的安全策略。

结尾

dsh-login-gate 在 DSH 自带 launch token 之上补一层网页密码门:scrypt + DPAPI 存储、会话 Cookie、IP 限流与本机初始化保护,并把设密与重置做成可复现的网页步骤。若你的 Harness 会对外暴露 HTTP 入口,可在社区目录或 GitHub 查看说明后按 web profile 安装并重启验证。

  • 目录页:https://www.skillhub.cn/plugins/duwenlong2/dsh-login-gate
  • GitHub:https://github.com/duwenlong2/dsh-login-gate
羽毛球分组比赛记分
小程序二维码

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

Xiaoye