dsh-plugin-notoken:反代场景下首次访问免 URL token

前言

用 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。

核心功能

  1. 稳定登录入口:默认路径 GET /__dsh_login,可在反代或书签中固定指向该路由或经 nginx 内部改写的等价入口。
  2. token 换会话:对通过信任围栏的请求,调用进程内 authorizeIndex() 逻辑,以 303 + Set-Cookie 等方式完成交换;已带会话的访问会 303 落到 ./。
  3. 适配浏览器导航与 SameSite:对无会话且标签为 cross-site(需 DSH 侧 allowCrossSiteNavigation 放行)或 none 的文档导航,在同一次响应中直接返回应用外壳并下发 cookie,避免 Strict cookie 在 303 链上出现「重定向次数过多」;same-origin / same-site 仍走 303。
  4. 与 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 反代

  1. 参考仓库 examples/nginx.conf。
  2. Host 原样透传(cookie 绑定 Host),且该 authority 必须在 DSH 的 trustedHosts 中。
  3. 只拦 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 或标准认证流程。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye