dsh-auth
August 14, 2026 · View on GitHub
DeepSeek Harness Web UI 的登录 / 注册窗口插件:侧边栏入口按钮 + 登录 / 注册弹窗, 自带演示鉴权 API 与内置管理员账号,开箱即用;也可一键切换代理模式对接你自己的账号系统。
⚠️ 玩具插件声明(Toy plugin)
本项目是一个演示/玩具性质的插件,仅用于学习和本地体验,不建议部署到生产环境: 强制登录只是前端 UI 层(可被绕过),演示模式使用明文 JSON 存储且无登录限流, 内置管理员账号密码公开在本文档中。生产环境请改用
mode: proxy对接真实鉴权服务, 并在dsh web前部署带认证的反向代理。

特性
- 侧边栏底部「登录 / 注册」入口,折叠态自动变为圆形图标,附 Tooltip。
- 登录 / 注册双 Tab 弹窗:表单校验、忙碌状态、错误与成功提示,支持回车提交; 管理员关闭注册后,注册 Tab 自动禁用并提示。
- 登录成功后侧边栏显示用户名,弹窗切换为「我的账号」资料视图,可一键退出登录。
- 会话令牌保存在浏览器 localStorage,刷新页面自动恢复登录状态。
- 强制登录:未登录时自动弹出登录窗口且无法关闭(无关闭按钮、Esc 与遮罩点击无效), 登录后才能使用界面。
- 内置管理员账号(演示模式):
admin / admin123,可随时开放/关闭注册。 - 账号管理(我的账号):管理员登录后,在「我的账号」视图里列出所有账号、 删除普通账号、一键开关注册。
- 演示模式(默认):宿主端自带账号存储(scrypt 加盐哈希 + 随机令牌),数据持久化到
profile 的
data/dsh-auth/auth.json,零外部依赖。 - 代理模式:把全部
/dsh-auth/*请求转发到你的鉴权后端,无 CORS 问题。 - 完全遵循官方插件通道:
dsh.bundle安装层 +dsh.client客户端模块 + slot 系统(sidebar.footer.action入口、shell.overlay弹窗、settings.general.item设置行)。
界面预览
| 登录 / 注册窗口 | 登录后状态 |
|---|---|
![]() | ![]() |
快速开始
需要 Node.js ≥ 22.19 和 @deepseek-ai/dsh
CLI(或 DeepSeek Harness 源码 checkout)。
从本地目录安装
cd dsh-auth
npm install # 或 pnpm install(仅构建期需要 tsdown/typescript)
npm run build # 生成 lib/index.js + lib/client.js
cd ..
dsh plugin --profile web add ./dsh-auth
dsh --profile web web
打开 http://127.0.0.1:3080,侧边栏底部即可看到「登录 / 注册」入口。
也可以直接安装构建产物:
dsh plugin --profile web add ./dsh-auth-0.1.0.tgz(先执行npm pack)。发布到 npm 后则为dsh plugin --profile web add dsh-auth。
从 GitHub 安装
dsh plugin --profile web add "github:Reyeraz/deepseek-harness-auth"
git 安装会在安装时执行 prepare 构建脚本(生成 lib/)。pnpm 默认禁止未白名单
包的构建脚本,所以第一次安装会失败,并在终端打印类似下面的提示:
Add the package to "allowBuilds" in your project's pnpm-workspace.yaml ...
allowBuilds:
dsh-auth@git+ssh://git@github.com/Reyeraz/deepseek-harness-auth.git#<sha>: true
把 pnpm 打印的那一行加到 $DSH_HOME/profiles/web/pnpm-workspace.yaml 的
allowBuilds 下,然后重新执行安装命令即可。
生产使用建议固定提交,避免后续推送悄悄改变安装内容:
dsh plugin --profile web add "github:Reyeraz/deepseek-harness-auth#<commit-sha>"
默认账号(演示模式)
| 角色 | 用户名 | 密码 |
|---|---|---|
| 管理员 | admin | admin123 |
登录管理员账号后,点击侧边栏账号入口打开「我的账号」即可管理账号:开关注册、 查看账号列表、删除普通账号。内置管理员账号不可删除。
从源码 checkout 安装(开发模式)
git clone https://github.com/deepseek-ai/deepseek-harness.git
cd deepseek-harness && pnpm install && pnpm run build
pnpm dsh plugin --profile web add /absolute/path/to/dsh-auth
pnpm dsh --profile web web
修改客户端代码后需重新构建 bundle(npm run build)再刷新页面;开发时也可以让
dsh web 以源码模式运行,并另开 pnpm run dev:web 监听 client bundle 热更新。
配置
配置写在 profile 的 cordis.patch.yml 或 bundle 行中。默认即演示模式,无需任何配置:
- insert:
- id: auth-window
name: dsh-auth
config:
mode: demo # demo | proxy
apiBaseUrl: '' # proxy 模式必填,转发目标
dataDir: '' # 演示模式数据目录;留空 = <profile>/data/dsh-auth
sessionTtlHours: 168
架构
插件由两个半区组成,全部通过官方插件通道挂载:
| 半区 | 入口 | 作用 |
|---|---|---|
| Host(Node) | src/index.ts | 在 ctx.webServer 注册 /dsh-auth/* 路由(同源、无 CORS);演示模式实现账号/会话/注册开关存储,代理模式转发外部 API |
| Client(浏览器) | src/client/index.ts | 通过 dsh.client 客户端模块机制加载;sidebar.footer.action 挂入口按钮,shell.overlay 挂登录窗口(未登录自动弹出且不可关闭;登录后的「我的账号」视图内嵌管理员账号管理),两处共享同一个 store 实例 |
shell.overlay 是官方文档中专门留给插件的「全屏悬浮层」插槽(additive list slot),
登录窗口以框架自带的 Modal 组件渲染在其上。
/dsh-auth API(演示模式)
| 方法 | 路径 | 请求体 | 返回 |
|---|---|---|---|
| POST | /dsh-auth/register | { username, password, displayName? } | 201 { ok, user };409 用户名已存在;403 注册已关闭 |
| POST | /dsh-auth/login | { username, password } | 200 { ok, token, user };401 凭据错误 |
| GET | /dsh-auth/session | 请求头 Authorization: Bearer <token> | 200 { ok, user };401 未登录/过期 |
| POST | /dsh-auth/logout | 请求头同上 | 200 { ok } |
| GET | /dsh-auth/meta | - | 200 { ok, mode, registrationOpen } |
| GET | /dsh-auth/admin/users | 请求头(管理员) | 200 { ok, users, registrationOpen };403 非管理员 |
| POST | /dsh-auth/admin/registration | { open: boolean }(管理员) | 200 { ok, registrationOpen } |
| POST | /dsh-auth/admin/users/remove | { username }(管理员) | 200 { ok, removed };内置管理员不可删 |
失败统一返回 { ok: false, error: { code, message } }。
安全说明
- 再次强调:本项目是玩具插件,不建议生产部署(见文首声明)。
- 演示模式仅适合本地/内网使用:明文 JSON 存储、无登录限流、单进程。
- 密码以 scrypt(随机盐)哈希保存;令牌只存 SHA-256 摘要,不落明文。
- 默认管理员密码仅用于本地演示,正式部署前请修改或改用代理模式。
- 生产使用请配置
mode: proxy接入真实鉴权服务,或基于本仓库二次开发。
开发与测试
npm run build # tsdown 构建宿主 + 客户端 bundle(无需 dsh checkout)
npm run typecheck # 需要 dsh 源码 checkout(tsconfig paths 指向其 lib/types)
npm pack # 生成可安装的 tarball
仓库附带 Playwright 端到端脚本,覆盖完整用户旅程(打开弹窗、注册、登录、刷新恢复会话、 查看资料、退出登录、错误密码提示、管理员账号管理、注册开关),并在每个步骤截图:
# 先启动 dsh web(默认 3080 端口),然后:
node scripts/e2e-test.mjs http://127.0.0.1:3080 ./test-shots
路线图
- 密码找回 / 邮箱验证流程
- 登录限流与失败锁定
- 将演示存储迁移到官方
ctx.storageDomain持久化 - 发布到 npm 与 dsh-plugin 主题
