# dsh-auth-gateway
Language: 简体中文 | English
为 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) Web 提供认证门禁的 Cordis 插件:**密码认证 + TOTP 双因素认证 + 多层防爆破 + 会话管理 + 登录审计**,并在网关层**真实拦截每一个请求**(HTTP 与 WebSocket),未认证流量无法触及后端。 `dsh web` 本身没有任何认证层(其内置 trust fence 是可达性策略而非认证)。本插件以进程内网关形态补齐认证面:对外端口由网关独占,内部 webserver 由 bundle patch 钉在回环地址,网关是唯一入口。 ## 安装和卸载 ```bash # 安装(从 npm registry) dsh plugin --profile web add dsh-auth-gateway # 启动(对外端口 8080,内部 webserver 自动挪到 8081) dsh web --port 8080 # 卸载(先清凭据,再移除插件) ~/.dsh/profiles/web/node_modules/.bin/dsh-auth-gateway-uninstall dsh plugin --profile web remove dsh-auth-gateway ``` - 支持从 GitHub / 本地目录安装,见 [docs/zh/INSTALL.md](docs/zh/INSTALL.md); - 忘记密码用 `dsh-auth-gateway-reset` 重置(重启后控制台打印新初始密码); - 部署指南:[docs/zh/DEPLOYMENT.md](docs/zh/DEPLOYMENT.md) ## 功能特性 - **密码认证**:首次部署自动生成初始密码(控制台打印,一次性),登录后引导设置个人密码(scrypt 哈希存储),之后每次访问需登录; - **双因素认证(TOTP)**:可选启用,兼容 Google Authenticator、Authy、1Password 等主流认证器;含一次性备份代码(scrypt 哈希存储、单次使用),设备丢失时可恢复访问;**OTP 密钥以 AES-256-GCM 加密存储**(主密钥来自环境变量 `DSH_AUTH_GATEWAY_MASTER_KEY` 或自动生成的 `auth-gate/otp-master.key`),磁盘泄露不再直接暴露第二因素根密钥; - **真实请求拦截**:未认证 `/api/*` 返回 401、页面类路径 302 到登录页、WebSocket 升级直接拒绝;认证通过后请求透明转发(Host/Origin 规范化,兼容内部 trust fence); - **子路径部署(basePath)**:支持挂在反向代理子路径下(如 `https://example.com/dsh/`)。配置 `basePath: /dsh` 后,网关自动处理路由剥离、302 跳转拼接与上游转发剥离;PWA 元数据(manifest/favicon)和静态资源(`/assets/*`)免认证放行。**注意**:DSH 是根路径应用,前端 JS 引用 `/assets/...`、`/api/...`、`/plugins/...` 等绝对 URL——子路径部署时这些路径不会自动带前缀,需要 nginx 额外转发。**推荐子域名部署**(`dsh.example.com`,根路径,零冲突),详见 [docs/zh/NGINX-DEPLOYMENT.md](docs/zh/NGINX-DEPLOYMENT.md); - **登录审计**:登录成功 / 失败 / 登出 / 改密均输出审计日志(`ctx.logger.info`,含来源 IP 与失败原因,不记录任何凭据),配合暴力破解告警形成完整可审计闭环; - **认证后的 LAN 设置支持**:在 DSH 客户端模块初始化前,将经过网关访问的浏览器连接标记为 loopback-trusted,使 Models、Credentials、语言/主题偏好和其他 host-backed settings 可读取并持久化; - **多层防爆破**:密码失败按来源锁定(默认 5 次/5 分钟)+ 全局速率限制(默认 60 次/分钟)+ OTP/备份码独立限流(默认 10 次/分钟),scrypt 在 libuv 线程池异步执行,登录洪峰不阻塞事件循环; - **会话管理**:内存 256-bit token(30 天),HttpOnly + SameSite=Strict Cookie,修改密码/禁用 OTP 吊销全部会话; - **安全事件**:锁触发、限流耗尽时输出告警日志并广播 `dsh-auth-gateway/brute-force` Cordis 事件(JSON 负载),供监控与联动; - **中英双语**:设置面板跟随 dsh 界面语言(设置 → 语言);登录 / 引导 / OTP 页面按你的语言偏好渲染(`$DSH_HOME/settings.yaml` 的 `locale.preference`),未设置偏好时跟随浏览器语言(Accept-Language),刷新即生效;首次部署的控制台提示中英对照输出; - **合规形态**:host-only 插件(零构建、零运行时依赖)+ 可选 client 半(设置面板,源码构建),全部经 dsh 官方扩展点(`ctx.effect`、`webServer.tapIndex`、`ctx.slots`)。 ## 工作原理 ``` 浏览器 ──> dsh-auth-gateway 网关(对外端口,运行在 dsh 进程内) │ 每个请求先过认证检查(会话表 O(1)) ├─ 未认证 ─> /api/*: 401 | 页面: 302 /login | WS: 拒绝 ├─ 未通过 2FA ─> /otp/verify └─ 已认证 ─> 转发(Host/Origin 改写为回环)──> dsh webserver(127.0.0.1:内部端口) ``` - 网关生命周期与 dsh 绑定:随 dsh 启动/退出,无独立进程; - bundle patch 将 webserver 移到回环端口(对外 = `--port`,内部 = 对外 + 1),远程无法绕过网关直连后端; - 网关在 DSH 的 `__ModuleLoader__` 加载 connection 模块时、Settings 等消费者启动前建立客户端 loopback trust;该兼容层不替代登录、HTTP/WebSocket 门禁或服务端 fence; - 认证状态机:`首次部署 → 初始密码登录 → 引导(设置个人密码)→ 登录 →(可选)OTP 验证 → 会话`;未完成引导或 2FA 的会话仅能访问对应验证端点。 ## 界面预览![]() 引导页(初始密码登录后) |
![]() 登录(含 2FA 验证码) |
![]() 2FA 登录成功 |
![]() OTP 设置(QR 码) |
![]() 设置菜单(含"认证设置"入口) |
![]() 认证设置面板 |