deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
为个人 DeepSeek Harness Web 实例提供 TOTP 访问验证。
简体中文 · English

在 DSH 入口输入身份验证器里的 6 位动态码,再进入你的工作区。支持 Google Authenticator、Microsoft Authenticator 等标准 TOTP 应用,绑定、保护开关、恢复码和锁定都在 DSH 内完成。
适合希望给个人 DSH Web 实例增加访问控制的用户,尤其是在局域网或远程访问场景中。它使用 TOTP 作为登录凭据,不依赖 Google / Microsoft 账号登录,也不需要额外搭建登录服务。
兼容目标:DSH 0.1.2-rc.1 · Node.js 24+ · MIT License
| 你想解决的问题 | dsh-totp 提供的能力 |
|---|---|
| 不希望别人知道地址就能进入 DSH | 开启保护后,本机、内网和公网访问同一入口都需要动态码 |
| 不想维护另一套账号或登录站点 | 在 DSH 的「设置 → 访问验证」中扫码绑定 |
| 希望自己决定什么时候启用验证 | 首次安装默认关闭,绑定成功后开启,之后可随时切换 |
| 暂时离开时希望立即收回访问权限 | 一键锁定所有已授权页面和设备,无需再输入动态码 |
| 担心换手机后无法访问 | 提供一次性恢复码和验证器更换流程 |
| 不希望绑定完成后再等一轮验证码 | 当前绑定页保持可用,保存恢复码后直接继续使用 |
通过已发布的 npm 包安装:
dsh plugin --profile web add dsh-totp
包已发布到 公共 npm registry。如果镜像尚未同步,可指定官方源:
dsh plugin --profile web add dsh-totp --registry=https://registry.npmjs.org
开发或检查当前源码时,在本仓库目录执行:
npm ci
dsh plugin --profile web add "$PWD"
插件按 profile 安装。上述命令添加到 web;如果使用其他 Web profile,请将 web 替换成相应名称。
本插件会替换该 profile 的 WebServer,并接管对外 HTTP 入口。请勿在同一 profile 叠加其他替换 WebServer 或接管登录流程的网关插件。插件直接分发 JavaScript,无需构建,也没有安装期脚本;普通打包不会运行测试或创建绑定数据。
如果 Web 实例已经运行,先停止它,再启动一次,让插件配置生效:
dsh --profile web --no-open
打开终端中 dsh-totp HTTP entry 打印的地址。
首次安装时,访问保护默认关闭。 你可以直接进入 DSH,再自行绑定验证器。升级、重装或普通重启会保留已有绑定和保护开关,不会把它们重置成默认值。
绑定成功后,保护立即开启。当前绑定页面继续可用,直接回到设置页,无需再次登录或等待动态码刷新。 其他已打开页面的旧授权会失效。
仅生成二维码或取消绑定,不会开启保护。绑定和换绑均在网页中完成,不提供 CLI 绑定命令。
| 操作 | 如何操作 | 结果 |
|---|---|---|
| 进入 DSH | 保护开启时,打开或刷新页面并输入动态码 | 获得当前页面的临时访问授权 |
| 开启 / 关闭保护 | 在设置页点击开关,输入一组新的动态码确认 | 立即生效,旧页面授权撤销;关闭后可直接访问 |
| 锁定所有设备 | 点击对话页右下角的「锁定」,或设置页的「锁定所有设备」 | 当前页和其他已授权页面立即锁定,无需动态码 |
| 更新恢复码 | 在设置页点击「更新恢复码」,输入新的动态码 | 生成 10 个新恢复码,旧恢复码失效 |
| 更换验证器 | 验证当前动态码,再扫描新二维码并确认新动态码 | 新验证器生效;当前页面可继续使用,其他页面重新验证 |
锁定按钮的状态:
锁定会关闭访问连接,插件不会主动取消 DSH 后台任务。具体任务在连接中断后的行为仍由 DSH 和所用插件决定。
在登录页点击 无法使用验证器,输入一个未使用过的恢复码,然后重新绑定验证器。
恢复码验证成功后,旧验证器和旧页面授权立即失效。在新验证器确认前,恢复授权仅允许绑定,不能访问 DSH 数据。确认新动态码并保存新恢复码后,可以直接进入 DSH,无需再登录一次。
每个恢复码只能使用一次。更新恢复码或成功换绑后,请用新的恢复码替换旧备份。
插件在 DSH 的 Web 服务前增加一个统一访问入口,在服务端判断是否允许访问。下图描述的是访问保护开启时的请求路径:
flowchart LR
A["身份验证器<br/>生成 6 位 TOTP"] -. "用户读取并输入" .-> B["浏览器<br/>本机 / 内网 / 公网"]
subgraph H["运行 DSH 的主机"]
G["dsh-totp<br/>统一访问入口"]
V{"页面授权有效?"}
L["显示登录页<br/>拒绝受保护的数据请求"]
W["DSH WebServer<br/>127.0.0.1 · 动态内部端口"]
D[("本地状态<br/>绑定 / 限流 / 恢复码摘要")]
G --> V
V -- "否" --> L
V -- "是" --> W
G <--> D
end
B -- "HTTP / WebSocket" --> G
保护关闭时,入口允许直接进入 DSH。这个开关控制的是实际访问权限。
允许其他设备通过本机 IP 访问:
dsh --profile web --host 0.0.0.0 --port 3080 --no-open
使用域名、公网地址或端口映射时,额外声明浏览器访问的 host:port。例如:
dsh --profile web --host 0.0.0.0 --port 3080 --no-open \
--trusted-host dsh.example.com:3080
请替换示例域名。--trusted-host 检查的是请求访问的 Host,不是来源 IP 白名单,也不会自动配置 DNS、防火墙或路由器端口映射。本机 IPv4 网卡地址会自动加入允许的访问地址。
开启保护后,localhost、内网 IP 和公网入口遵循相同的动态码验证规则。
| 项目 | 当前行为 |
|---|---|
| 动态码 | 标准 TOTP,HMAC-SHA-1,6 位,每 30 秒更新,时间容差 ±1 步 |
| 防重放 | 同一验证器时间步只接受一次,消费记录持久化,重启后仍有效 |
| 单来源失败限制 | 服务端看到的每个来源 IP,5 分钟窗口最多 5 次失败 |
| 全局失败限制 | 所有来源合计,1 分钟窗口最多 10 次失败 |
| 页面授权 | 默认无用户操作 15 分钟到期,最长 8 小时 |
| 绑定流程 | 5 分钟内有效 |
| 恢复码 | 10 个一次性恢复码;更新或重新绑定后旧码失效 |
登录、恢复和涉及动态码的管理操作共用失败额度。成功验证、格式错误和已使用码不计入失败次数;成功验证也不会抹去此前的失败记录。达到限制后,页面会显示等待倒计时。
出现「此动态码已使用」怎么办? 已验证的 DSH 页面可继续使用;若要进入另一个页面,或执行另一个需要动态码的操作,等待验证器刷新后再输入。无需为了结束绑定流程等待新码。
支持 HTTP,不代表提供链路加密。 HTTP 下的二维码、动态码、页面凭据和 DSH 数据可能被链路上的攻击者窃取或篡改。TOTP 访问控制无法替代 HTTPS 或其他受保护的传输通道,也不提供防钓鱼能力。
此外,请按以下能力范围使用:
/api/ WebSocket 和受限资源请求;第三方插件自建连接路径可能需要额外适配。可在对应 profile 的 cordis.patch.yml 中配置:
- id: dsh-totp
config:
host: '0.0.0.0'
port: 3080
allowedHosts:
- 'dsh.example.com:3080'
idleMs: 900000
maxMs: 28800000
修改监听地址、端口或数据目录需要重启;页面内的保护启停和锁定立即生效。
DSH 会通过插件导出的 Config 校验配置。host 支持 127.0.0.1 和 0.0.0.0;port 为 0–65535 的整数(0 表示动态端口);idleMs 不得大于 maxMs,两者为正整数且最长不超过 24 小时。allowedHosts 填写 host[:port],不带协议或路径。
默认依次使用 DSH_TOTP_DATA_DIR、$DSH_HOME/dsh-totp、~/.dsh/dsh-totp。插件配置的 dataDir 可覆盖默认路径。
每个数据目录只允许一个运行中的插件实例。多个 DSH 实例应使用不同目录。普通重启保留绑定和保护状态,但不保留页面授权。
在本仓库目录执行:
node src/cli.js status
node src/cli.js doctor
node src/cli.js enable
node src/cli.js disable
node src/cli.js lock
这些是持有本机管理权限的恢复与运维入口,不要求手机动态码。lock 命令会开启保护并锁定所有页面,因此与保护关闭时置灰的网页按钮不同;未绑定时不能开启保护。
可附加 --data-dir /path/to/data。本机命令必须与插件使用同一数据目录。它们不支持扫码绑定或换绑。
npm ci
npm run verify
npm pack
check 检查 JavaScript 语法,并运行 TOTP、持久化、防重放、限流、恢复、页面授权、HTTP / WebSocket 网关和发布脚本测试。测试使用临时目录、回环端口和模拟上游,不读取你的 DSH 数据,也不向 npm 或 GitHub 发布。
verify 依次运行 check 和 check:package。后者解析 bundle YAML,校验版本、发布清单、运行入口与本地引用,并验证前端模块能按包名注册设置插槽。yaml 仅用于开发检查,不是运行依赖。
npm pack 直接生成安装包;npm publish 通过 prepublishOnly 自动运行 verify。发布内容包含运行源码、插件配置、README、封面及说明和许可证,不包含本地依赖或测试数据。
GitHub Actions 配置为在 Node.js 24 的 Linux、macOS 和 Windows 上运行这两项检查。自动测试使用模拟 DSH 上游,不能代替目标 DSH 环境的浏览器交互验证。
封面是概念插画,架构图以本仓库实现为准。DSH 升级后,请在目标环境复核绑定、登录、保护开关和锁定流程。
收录条目及评审证据见 收录准备说明,实现取舍见 同类插件源码对照。
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。