dsh-auth-cookie-sweep:在 Host 側清理陳舊 dsh-auth 會話 Cookie

前言

DeepSeek Harness(DSH)通過本地 Host 提供 Web 界面,瀏覽器用 dsh-auth-* 會話 Cookie 完成鑑權。Host 每次啓動若採用動態端口,瀏覽器仍按 127.0.0.1 共用同一 Cookie jar,舊啓動留下的 Cookie 不會被自動刪除;多次啓動後 Cookie 請求頭可逼近 Node 的 16 KiB 上限,請求在到達業務邏輯前即被拒絕,表現爲 431 Request Header Fields Too Large,有時界面只顯示 401 或「Web authentication failed」。刪會話、重裝往往無法恢復,因爲 jar 裏堆積的是歷史端口對應的 Cookie。

下面介紹社區插件 dsh-auth-cookie-sweep(維護者 GuYou9799,分類 admin-security):在 Host 進程內對響應路徑做包裝,在合適閾值下過期不屬於當前 authority 的陳舊 dsh-auth-*,避免長期反覆啓動把請求頭撐爆。插件以 npm 包 dsh-auth-cookie-sweep 分發,當前版本 0.1.4,許可證 MIT。

這是什麼

dsh-auth-cookie-sweep 是掛在 Host 進程裏的 Cordis 小插件:依賴公開的 webServer 服務,包裝 ServerResponse.writeHead,在發響應前根據請求的 authority 識別「其它啓動」留下的 dsh-auth-*,並按策略追加 Max-Age=0 的 Set-Cookie,讓瀏覽器從 jar 中刪掉它們。

與改 app.asar、重打包 Electron 相比,它不改變 DSH 本體;README 說明其不存儲數據、不附帶前端 bundle、不聯網。DSH 升級後仍可用,只要 webServer 行爲保持兼容。

Cookie 爲何會累積

理解插件前,先對齊 DSH 側與瀏覽器側的行爲(README 中的歸納):

組件 行爲
@deepseek-ai/dsh-desktop-host 以 --port 0 等方式啓動 Host,每次啓動端口可能不同
@deepseek-ai/dsh-client-connection Cookie 名爲 dsh-auth- + sha256(authority),與當次 Host 的 authority 綁定
瀏覽器 Cookie 不按端口隔離,同一 host 下多條 dsh-auth-* 會隨每次請求一併送出
有效期 約 30 天,且無登出流程刪除舊 Cookie

於是每啓動一次常多出一條 Cookie,jar 只增不減;Cookie 頭大約每次增長 200 字節量級。到約第 72 次啓動附近可能越過 16 KiB,Node HTTP 解析器在任何 handler(含 DSH 自身)運行前就拒絕請求,故障表現爲「永久性」無法打開。

核心功能

響應階段的清理邏輯

對每個進入 Host 的請求,插件大致做三件事:

  1. 讀取 Cookie 頭與當前請求的 authority(與 Host 歸一化方式一致:HTTP 爲 host[:port],HTTPS 爲 scheme://host[:port]);
  2. 找出屬於其它 authority(舊啓動)的 dsh-auth-*;
  3. 在滿足清理條件時,在 Host 原有響應頭之外追加過期指令,例如:
set-cookie: dsh-auth-fkJh9Q9…=; Max-Age=0; Path=/; HttpOnly; SameSite=Strict

當前這次啓動簽發的 Cookie 不會被誤刪;Host 在 303 換取時仍可正常下發新 Cookie,並與清理指令出現在同一條響應裏。

併發保護

單條「外來」dsh-auth-* 可能屬於另一個正在運行的 DSH 實例(另一端口)。貿然刪除會讓該實例掉線並再生成 Cookie。因此僅在下列情況之一才清理:

  • 外來會話 Cookie 數量 ≥ minStaleCookies(默認 3),或
  • 整個 Cookie 頭已達到/超過 maxCookieHeaderBytes(默認 4096 字節)。

多開一個實例通常只會多一條 Cookie,在默認閾值下不被清理;長期反覆啓動則不會在 jar 裏無限堆積。

實現與依賴範圍

  • 入口 lib/index.js:inject: ["webServer"],在 HTTP 服務器創建後掛 request 監聽,卸載時通過 ctx.effect 移除。
  • lib/purge.js:authority 與 cookie 名推導(與 dsh-client-connection 一致)、閾值策略、writeHead 包裝。
  • 除清理計數外基本不打日誌;不讀取、保存或打印 Cookie 值。
  • 運行環境:engines 要求 Node ^22.19.0 || >=24.0.0,DSH >=0.2.0-rc.2。

README 記載在 DSH 0.2.2-rc.1 上做過驗證;集成測試模擬約 300 次啓動,斷言 jar 規模與請求頭體積受控。

安裝與啓用

本插件是普通的 profile bundle(cordis.patch.yml 經 dsh.bundle.patch 注入)。web profile 可用 CLI 安裝:

dsh plugin --profile web add dsh-auth-cookie-sweep

若使用本地目錄,可用 file: 前綴指向絕對路徑(README 示例):

dsh plugin --profile web add file:/插件的絕對路徑/dsh-auth-cookie-sweep

dsh plugin add 只添加依賴;若你的插件管理器不會自動維護 bundle 列表,還需把包名寫入 ~/.dsh/profiles/<profile>/package.json 的 dsh.profile.bundles,例如:

{
  "dsh": {
    "profile": {
      "bundles": ["@deepseek-ai/dsh-base", "@deepseek-ai/dsh-web-app", "dsh-auth-cookie-sweep"]
    }
  }
}

不啓動 DSH 也可檢查組合是否生效:

dsh --profile web --dump-config | grep -A2 auth-cookie-sweep

期望輸出中包含 id: dsh-auth-cookie-sweep 等條目。

桌面版(desktop profile):CLI 會拒絕 dsh --profile desktop 一類操作,README 建議通過應用內插件管理器/插件市場安裝,或自行修改 ~/.dsh/profiles/desktop/package.json 中的依賴與 bundles 後重啓 DSH。

社區插件目錄頁:https://www.skillhub.cn/plugins/GuYou9799/dsh-auth-cookie-sweep(與 DeepSeek / 幻方無官方從屬關係,僅爲社區收錄站點)。

配置項

在 bundle 的 insert 上可增加可選 config(非法或越界值會被收斂到安全範圍):

- insert:
    - id: dsh-auth-cookie-sweep
      name: dsh-auth-cookie-sweep
      config:
        minStaleCookies: 3         # 1..256
        maxCookieHeaderBytes: 4096 # 512..16384
        maxDeletions: 64           # 1..512,單次響應最多過期指令條數
        secure: false              # 省略則跟隨 Host 協議

已經打不開時怎麼辦

插件無法挽救已經超過 16 KiB、已被 Node 在解析階段以 431 拒絕的請求——此時任何 Host 側 JavaScript 都不會執行。需要先手工清空一次 jar,之後由插件長期抑制再堆積:

  • 瀏覽器:開發者工具 → Application → Cookies → 對應 http://127.0.0.1:<端口> → 刪除所有 dsh-auth-*,或清除該站點數據。
  • 桌面版 Electron:退出 DSH 後刪除 %APPDATA%\@deepseek-ai\dsh-desktop\Network\Cookies 與 Network\Cookies-journal(README 稱 DSH 不依賴該存儲中的其它 Cookie),再啓動。

適用場景與注意

適合誰:長期在本地反覆啓動 DSH Web / 桌面 Host、且使用瀏覽器或 Electron 共用 127.0.0.1 Cookie jar 的開發者;希望用 Host 側小改動避免「幾十次啓動後再也打不開」的場景。

侷限(README 原文要點):

  • 對已觸發 431 的 jar 必須先手工清理一次。
  • 只處理到達本 Host 的 Cookie;其它 origin 或 profile 的 jar 各自管理。
  • 瀏覽器對單域名 Cookie 數量也有上限;插件把數量壓到足夠低,避免該上限成爲新症狀。

安全與信任:插件隨當前 DSH Host 進程權限運行,會介入 HTTP 響應頭中的 Set-Cookie。安裝前應閱讀 GitHub 倉庫 源碼與 MIT 許可證,確認與自身環境策略一致。社區目錄與 GitHub 爲公開信息來源,不代表官方應用商店審覈結論。

結尾

dsh-auth-cookie-sweep 針對 DSH 本地 Web 鑑權 Cookie 按啓動累積、最終撐爆 Cookie 請求頭的問題,在 Host 響應路徑上按閾值過期陳舊 dsh-auth-*,並保留對併發多實例的保守策略。安裝命令以 README 爲準:dsh plugin --profile web add dsh-auth-cookie-sweep。

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

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

小夜