zephaniahwang94-cmyk/dsh-auth-gate0

dsh-auth-gate

Authentication and security hardening plugin for DeepSeek Harness

包名
dsh-auth-gate
版本
1.1.0
许可证
MIT
最近更新
2026年8月18日

安装

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:zephaniahwang94-cmyk/dsh-auth-gate

Configuration

Bearer Token mode

For scripts and non-browser clients. HTTP and WebSocket requests must include Authorization: Bearer , and the token must be at least 32 bytes. Browser WebSocket APIs cannot set this header, so use session or both for the Web UI.

Option A: Environment variable

$env:DSH_AUTH_TOKEN = [Convert]::ToHexString(
  [Security.Cryptography.RandomNumberGenerator]::GetBytes(32)
).ToLowerInvariant()
dsh web

Option B: Config (not recommended because config diagnostics may expose it)

config:
  mode: bearer
  # Deliberately empty: generate a private token; never copy a documented value.
  token: ''

Usage:


# 公网 URL 使用 HTTPS 时必须设置:
$env:DSH_AUTH_SECURE_COOKIE = 'true'

.\install.ps1 -Protection Full
.\install.ps1 -Protection NetworkAuth
.\install.ps1 -Protection ApprovalLimit

如果 dsh 不在 PATH,脚本会自动使用同级的 deepseek-harness 源码仓库;位于其他目录时传入 -HarnessPath C:\path\to\deepseek-harness

默认是 Full。添加 -Start 可立即启动;否则脚本会输出准确的启动命令,例如:

dsh --profile web --patch C:\path\to\dsh-auth-gate\presets\full.yml
预设HTTP + WebSocket 认证审批限流重要后果
Full推荐
NetworkAuth审批提示不受本插件限流
ApprovalLimit网络控制面仍无认证

HTTP 和 WebSocket 认证不可拆分,避免 UI 已认证但 RPC upgrade 裸露。旧版顶层配置继续兼容;没有 protections 时等同完整防护。

初始密码与协作者

终端用户

在启动 Harness 的同一个进程环境中设置凭据,不要把真实密码写进 YAML 或命令行参数。

cd C:\path\to\deepseek-harness
$env:DSH_AUTH_USERNAME = 'admin'
$env:DSH_AUTH_PASSWORD = Read-Host '请输入私有密码(至少12个字符)'
$env:DSH_AUTH_SECURE_COOKIE = 'false' # 仅本机 HTTP;HTTPS 必须为 true
pnpm dsh web

环境变量修改不会影响已经运行的进程;修改密码后必须重启 Harness。每次启动都会生成新的 session 签名密钥,因此重启也会让全部浏览器会话退出。

只使用 WebUI 的 Windows 用户

首次密码不能安全地在受保护的 WebUI 内创建,因为页面开放前认证就必须存在。打开 开始菜单 → 编辑账户的环境变量,新增 DSH_AUTH_USERNAMEDSH_AUTH_PASSWORDDSH_AUTH_SECURE_COOKIE,然后彻底退出并重新打开 Harness WebUI 启动器。Windows 会保存用户环境变量,同一操作系统用户运行的其他进程可能读取它们,因此只适用于可信的本机账户。

协作者账户

1.1 版本目前只支持一个共享登录身份,不能创建第二个独立命名的协作者账户,也不能把操作归因到不同人员。共享主密码虽然可以访问,但不属于独立账户,不建议用于互不信任的团队。

临时可信协作者可使用以下流程:轮换共享密码并重启 Harness,通过安全渠道发送密码;协作结束后再次轮换并重启。长期协作者应使用独立 Harness 实例/操作系统身份,或在前方部署支持每人独立身份的认证反向代理。即使认证通过,用户仍共享 Agent、session、workspace 权限和审计身份,不具备 per-user 隔离。

配置

Bearer Token 模式

用于脚本及非浏览器客户端。HTTP 和 WebSocket 请求都必须带 Authorization: Bearer ,token 至少 32 字节。浏览器 WebSocket API 无法设置该请求头,因此 Web UI 请使用 sessionboth

方式一:环境变量

$env:DSH_AUTH_TOKEN = [Convert]::ToHexString(
  [Security.Cryptography.RandomNumberGenerator]::GetBytes(32)
).ToLowerInvariant()
dsh web

方式二:配置文件

config:
  mode: bearer
  # 故意留空:请生成私有随机 token,不要复制文档中的固定值。
  token: ''

验证:


### 只使用 WebUI 的 Windows 用户

首次密码不能安全地在受保护的 WebUI 内创建,因为页面开放前认证就必须存在。打开 **开始菜单 → 编辑账户的环境变量**,新增 `DSH_AUTH_USERNAME`、`DSH_AUTH_PASSWORD` 和 `DSH_AUTH_SECURE_COOKIE`,然后彻底退出并重新打开 Harness WebUI 启动器。Windows 会保存用户环境变量,同一操作系统用户运行的其他进程可能读取它们,因此只适用于可信的本机账户。

## 配置

### Bearer Token 模式

用于脚本及非浏览器客户端。HTTP 和 WebSocket 请求都必须带 `Authorization: Bearer `,token 至少 32 字节。浏览器 WebSocket API 无法设置该请求头,因此 Web UI 请使用 `session` 或 `both`。

**方式一:环境变量**

```powershell
$env:DSH_AUTH_TOKEN = [Convert]::ToHexString(
  [Security.Cryptography.RandomNumberGenerator]::GetBytes(32)
).ToLowerInvariant()
dsh web

方式二:配置文件

config:
  mode: bearer
  # 故意留空:请生成私有随机 token,不要复制文档中的固定值。
  token: ''

验证:


## 配置参考

| 字段 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `mode` | `'bearer' \| 'session' \| 'both'` | `'bearer'` | 认证模式 |
| `protections.networkAuth` | `boolean` | `true` | 启用不可拆分的 HTTP + WebSocket 认证 |
| `protections.approvalRateLimit` | `boolean` | `true` | 启用审批 waterfall 限流 |
| `auth` | `object` | — | 下列认证字段也可统一写在此对象中 |
| `token` | `string` | 环境变量 `DSH_AUTH_TOKEN` | Bearer token |
| `sessionSecret` | 不支持 | 每次启动随机生成 | 拒绝持久密钥,避免已注销 Cookie 在重启后复活 |
| `sessionTtl` | `number` | `3600` | Session 有效期(秒) |
| `loginPath` | `string` | `'/auth/login'` | 登录页路径 |
| `username` | `string` | — | 登录用户名 |
| `password` | `string` | — | 登录密码 |
| `secureCookie` | `boolean` | `false` | 为 Cookie 添加 `Secure`;HTTPS 必须启用 |
| `approvalRateLimit.maxPerMinute` | `number` | `3` | 每分钟最大升级请求数 |
| `approvalRateLimit.maxPerSession` | `number` | `10` | 每 session 最大升级请求数 |

Bearer token 必须至少 32 字节。登录尝试按来源地址限制为每分钟 5 次。每次启动都会生成新 session secret 并使旧浏览器会话失效;由于注销状态只在进程内保存,持久密钥会被拒绝。