dsh-auth

August 14, 2026 · View on GitHub

DeepSeek Harness Web UI 的登录 / 注册窗口插件:侧边栏入口按钮 + 登录 / 注册弹窗, 自带演示鉴权 API 与内置管理员账号,开箱即用;也可一键切换代理模式对接你自己的账号系统。

license language platform

⚠️ 玩具插件声明(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.yamlallowBuilds 下,然后重新执行安装命令即可。

生产使用建议固定提交,避免后续推送悄悄改变安装内容:

dsh plugin --profile web add "github:Reyeraz/deepseek-harness-auth#<commit-sha>"

默认账号(演示模式)

角色用户名密码
管理员adminadmin123

登录管理员账号后,点击侧边栏账号入口打开「我的账号」即可管理账号:开关注册、 查看账号列表、删除普通账号。内置管理员账号不可删除。

从源码 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.tsctx.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 主题

License

MIT