dsh-auth-gate
DSH Web UI 的认证门禁插件,提供 SVG 图形验证码与防暴力破解保护
安装
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:jiang539/dsh-auth-gate说明文档
阅读完整 README ↗dsh-auth-gate
English: README.en.md · 简体中文
面向 DeepSeek Harness(DSH)的安全认证插件。
它在 DSH Web UI 前加一道登录门,并提供 Nginx auth_request 可强制校验的 /auth API,
让局域网或公网部署获得身份验证与防暴力破解能力,且无需改动 DSH 本身。
对接真实的 DSH 插件 API(
ctx.webServer.register、Cordis 槽位系统、dsh.client打包契约)实现。
工作原理
外网用户 → Nginx (HTTPS + 限流)
→ auth_request (Nginx 层认证校验, 子请求到 /auth/verify)
→ DSH Web UI (插件登录门 + 登录页)
DSH 内部: dsh-auth-gate 插件注册 /auth/* 路由
- GET /auth/captcha → 图形验证码 { svg, uuid } (一次性)
- POST /auth/login → 校验 验证码+账号+密码 → { token }
- GET /auth/verify → 校验 Token (供 Nginx auth_request 调用)
- POST /auth/logout → 销毁会话
- POST /auth/password → 修改自己的密码 (需登录, 校验旧密码)
两层相互独立的强制校验:
| 层 | 机制 | 说明 |
|---|---|---|
| Nginx 层 | auth_request /_auth → 子请求 GET /auth/verify | 没有合法 Token 的请求在到达 DSH 之前就被 401 拒绝 |
| 插件层 | 客户端登录门 + 服务端会话 | 浏览器打开页面时校验 Token;未登录时整个 UI 被登录页遮挡,服务端不签发会话 |
功能特性
- SVG 图形验证码 — 一次性使用、过期自动失效、剔除
0o1i等易混淆字符 - 防暴力破解 — 同一 IP 在
blockDuration窗口内的连续失败(验证码错误或密码错误均计数)达到maxLoginAttempts后锁定blockDuration秒;另有 Nginx 限流兜底 - 会话管理 — 服务端内存存储 Token + 滑动过期(
/auth/verify每次调用顺延sessionTimeout) - 密码安全 — bcrypt 哈希存储(
username:bcrypt_hash,权限 0600),绝不存明文 - 双端集成 — Host 端注册
/auth/*路由;Client 端通过 DSH 官方 Slot 机制注册登录页(root slot 优先级 -1 覆盖布局,登录成功后自动释放) - 信任代理 — 支持从
X-Forwarded-For获取真实客户端 IP;仅当直接对端是回环地址(同机 Nginx)时才信任该头,且取代理追加的最后一项,客户端伪造的前缀无法绕过锁定
安装
# 1. 将插件添加到 profile(会作为 profile 的依赖安装)
dsh plugin --profile web add dsh-auth-gate
# 2. 创建带 bcrypt 哈希的密码文件(每行一个用户)
mkdir -p ~/.dsh
npx dsh-auth-passwd set admin # 交互式输入密码,权限 0600
# 或手动生成(⚠️ 明文会出现在 shell 历史与进程列表中,仅限一次性使用):
node -e "console.log(require('bcryptjs').hashSync('你的密码', 10))" > ~/.dsh/auth.passwd
# 3. 重启 DSH
dsh web