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 或標準認證流程。

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

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

小夜