前言¶
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。
- 仓库:github.com/duwenlong2/dsh-login-gate
- 社区目录:skillhub.cn/plugins/duwenlong2/dsh-login-gate
- 许可证:MIT
- 当前 package 版本:0.2.1(资料来源 package.json)
- 运行环境:Windows(DPAPI)、Node 20+
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,应看到设置页或登录页。
典型用法¶
首次设置密码¶
- 打开
http://127.0.0.1:3080 - 自动进入「设置访问密码」
- 输入两次密码(可用「显示」核对)
- 点击「保存并进入」→ 自动登录并进入 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-sessionsecret 代签 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