前言¶
用 DeepSeek Harness(DSH)跑 dsh web 时,浏览器第一次打开控制台通常要在地址里带上 ?token=…,token 来自进程启动输出。若前面挂了 nginx 等反向代理、希望用户直接访问根路径 /,就要在代理层或书签里想办法把 token 塞进去,运维和分享链接都不顺手。
@beyondandsharp/dsh-plugin-notoken 是 DSH 的 web profile 本地插件:注册固定登录入口路由,在服务端把进程里的启动 token 换成浏览器会话 cookie,让「首次访问」不必在 URL 里带 token。维护者为 BeyondandSharp,在插件目录中归类为 admin-security。下文按安装、原理要点、nginx 配合与安全边界说明可核对的事实;安装前请自行阅读仓库源码与 MIT 许可证。
这是什么¶
插件在 DSH web 进程内注册一个登录入口(默认 GET /__dsh_login)。请求经信任围栏校验后,用当前进程 token 完成 token → cookie 交换,后续访问走 DSH 既有的浏览器会话机制,而不是长期依赖 URL 参数。
它不修改 DSH 源码、不签 cookie、不接触密钥、不解析启动输出;通过 cordis.patch.yml 以 bundle patch 方式挂入 web profile。
核心功能¶
- 稳定登录入口:默认路径
GET /__dsh_login,可在反代或书签中固定指向该路由或经 nginx 内部改写的等价入口。 - token 换会话:对通过信任围栏的请求,调用进程内
authorizeIndex()逻辑,以 303 +Set-Cookie等方式完成交换;已带会话的访问会 303 落到./。 - 适配浏览器导航与 SameSite:对无会话且标签为 cross-site(需 DSH 侧
allowCrossSiteNavigation放行)或none的文档导航,在同一次响应中直接返回应用外壳并下发 cookie,避免 Strict cookie 在 303 链上出现「重定向次数过多」;same-origin / same-site 仍走 303。 - 与 nginx 反代配合:仓库提供
examples/nginx.conf,典型做法是把裸/的 401 在服务端内部改写到入口,地址栏可全程停在/;/api与 WebSocket 需原样透传。
安装与启用¶
在已安装 DSH 且使用 web profile 的环境中,官方 README 给出的安装方式如下($DSH 为 DSH 可执行路径或别名):
$DSH plugin --profile web add @beyondandsharp/dsh-plugin-notoken # 从 npm
# 也可以直接装 GitHub 或本地目录:
$DSH plugin --profile web add github:BeyondandSharp/dsh-plugin-notoken
$DSH plugin --profile web add /path/to/dsh-plugin-notoken # DSH=/path/to/dsh
npm 包名为 @beyondandsharp/dsh-plugin-notoken,当前 package.json 中版本为 1.0.6。插件以当前 dsh web 进程权限运行;安装前应检查 notoken.js 与 patch 内容是否符合你的安全策略。
典型用法¶
直连或本地调试¶
启用插件后,浏览器首次可访问默认入口 GET /__dsh_login(或你配置后的等价路径),由插件完成 cookie 交换,再进入控制台外壳。若 dsh web 只绑定特定接口,外壳回源会使用进程监听的真实 host:port,README 提醒:dsh web --host <地址> 只监听该接口时,用 127.0.0.1 回环可能 ECONNREFUSED。
与 nginx 反代¶
- 参考仓库 examples/nginx.conf。
Host原样透传(cookie 绑定 Host),且该 authority 必须在 DSH 的trustedHosts中。- 只拦
location = /,不要把/api与 WebSocket 改写进登录入口。
经 nginx 内部改写时,用户地址栏可仍为 /,而直连入口的 none 导航地址栏会停在入口路径;两种部署方式 README 均有说明。
原理要点(与 DSH 认证缝隙的关系)¶
DSH 在 frontend-static 渲染 index 前和 /api 路由上会做浏览器认证;插件注册的具名路由在两者之前匹配,默认不经过上述认证。本插件的入口即利用这条匹配顺序:先 requestRejection() 过信任围栏(403 拒绝;401 且无会话时放行),再取进程 token 并完成 index 授权交换。
mode: redirect 在 exchange 之前 302 到带 token 的 URL,README 标明其为兼容回退,不覆盖主屏启动场景;完全不发送 Sec-Fetch-* 的老客户端仍走 303。
适用场景与注意¶
适合:内网或已严格限制网络可达性、且 Host 已纳入 DSH 信任围栏;希望通过 nginx 提供「干净 URL」、又不想把启动 token 写进书签或分享链接的部署。
不适合或需极度谨慎:任何对监听端口可达、且 Host 能通过信任围栏的访问者。
README 用显目警告说明:装上之后,任何能访问该端口且 Host 通过 DSH 信任围栏的人,都相当于获得 operator 权限——可执行工具、读取凭据、并以运行 dsh web 的 OS 用户身份操作本机。这不是「少输一次 token」的便利插件,而是主动去掉浏览器侧认证步骤;公网暴露或未做网络隔离时不应使用。
社区插件目录(如 skillhub.cn)与 DeepSeek / 幻方无官方从属关系;选用插件属于「一切皆插件」生态下的自主决策,务必以源码与许可证为准。
验证与参考¶
仓库内可用以下命令做自检(来自 README):
node --test && bash verify/e2e.sh
- 插件目录页:https://www.skillhub.cn/plugins/BeyondandSharp/dsh-plugin-notoken
- 源码与完整说明:https://github.com/BeyondandSharp/dsh-plugin-notoken
若你的场景是「反代 + 首次访问不带 ?token=」,且已接受上述 operator 等价暴露风险,可按 README 安装并在 nginx 示例基础上收紧 trustedHosts 与网络 ACL;否则应继续使用 DSH 默认的 URL token 或标准认证流程。