dsh-cookie-sentinel:缓解 DSH Desktop 随机端口下的 dsh-auth Cookie 堆积与 HTTP 431

前言

在 DeepSeek Harness(DSH)Desktop 里,Host 每次启动会在本机随机端口上拉起 Web 服务;@deepseek-ai/dsh-client-connection 会按请求 authority(含端口)为浏览器会话命名 dsh-auth-<sha256("127.0.0.1:<port>")> 形式的 Cookie。Cookie 按 host 存储、端口不参与区分,且单次颁发的 Cookie 有效期约 30 天。多次启动后,127.0.0.1 上会残留大量未过期的 dsh-auth-… 条目。当累计到约 70 条时,请求里的 Cookie 头体积可能超过 Node 默认约 16 KiB 的 HTTP 头上限,Host 在路由之前就返回 431 Request Header Fields Too Large,Electron 欢迎页侧常见 desktop welcome: Web authentication failed。

下面介绍社区插件 dsh-cookie-sentinel(维护者 zhkkjF,分类 admin-security):在 Host 侧提高可配置的 header 上限,并在「签发新 Cookie」的那次 launch-token 响应里清理其余陈旧 dsh-auth-…,避免随机端口场景把桌面锁在 431 之外。

这是什么

dsh-cookie-sentinel 是仅作用于 DSH Desktop Host 的插件包(无构建步骤,运行时除 Node 内置模块外无额外依赖)。它在 apply(ctx) 里做两件事:为在线 http.Server 提高 header 预算;在 connection.authorizeIndex 仅在「mint 新 dsh-auth-… Cookie」的响应上追加对其它同名前缀 Cookie 的 Max-Age=0 删除。设计约束是 apply 不抛错——Desktop 会把启动入口失败视为致命,防护插件不能反过来阻止启动。

生态上 DSH 奉行「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无资料所述的官方从属关系。安装前宜自行审阅源码与许可证;插件随当前 DSH 进程权限运行。

故障机理(资料中的描述)

每次启动使用新 loopback 端口时,都会再留下一条针对当时端口的 dsh-auth-… Cookie,旧条目不会自动消失。请求携带的 Cookie 头随启动次数变长,最终在 Node 解析阶段触发 431,认证路由 unreachable。

核心功能

1. Header 余量(Headroom)

将运行中 http.Server 的 header 上限提高到 128 KiB(可通过配置在 16 KiB–1 MiB 范围内调整,默认 131072 字节)。Node 对每个新连接读取 server.maxHeaderSize;在 Cookie 罐已经「胀破」默认 16 KiB 的那一次请求上,仍有机会到达认证路由而不是死在解析器。webServer 服务可能在消费方插件 [Service.init] 完成前就可用,因此若在最长约 10 s 内还拿不到 server 对象,包内会重试。

2. 仅在 mint 响应时修剪(Mint-driven pruning)

包装 connection.authorizeIndex:仅当该响应 mint 新的 dsh-auth-… Cookie(launch-token 交换)时,对请求中携带的其它 dsh-auth-… 名称追加 Set-Cookie: …; Max-Age=0。Electron 会话会落实删除,罐内理想情况只保留当前这次启动的 Cookie。若响应不 mint(例如 401,或之后的 200),不做删除——避免未来 DSH 改动 Cookie 拼写时误删仍有效的 Cookie。

README 记载的验证要点包括:70 条 Cookie(约 17,638 字节)返回 401 而非 431;在 128 KiB 配置下约 600 条 Cookie 仍会 431,与边界一致;合成 mint 场景下 70 条陈旧 Cookie 可产生 1 次 mint + 70 条删除的 Set-Cookie。

安装与启用

可从插件市场安装,或按 README 直接添加:

dsh plugin --profile <profile> add github:zhkkjF/dsh-cookie-sentinel

将 <profile> 换成你实际使用的 DSH profile 名称。包为 host-only,无需单独 build。

在 profile 配置中插入插件条目(字段名与默认值以 README 为准):

- insert:
    - id: dsh-cookie-sentinel
      name: dsh-cookie-sentinel
      config:
        maxHeaderSize: 131072   # 16 KiB – 1 MiB, default 128 KiB

审计日志与观测

每次启动会向 ~/.dsh/cookie-sentinel.log 追加日志行,例如:

2026-11-03T12:15:22.306Z loaded
2026-11-03T12:15:22.307Z ready headerLimit=131072
2026-11-03T12:15:22.315Z pruned=1 host=127.0.0.1:63104

pruned=N 表示 launch-token 响应里删除的陈旧 dsh-auth-… 数量。README 说明:首次干净启动之后,后续启动通常应为 N=1;若 N 持续增大,表示 Electron 会话未保存删除指令,需要另寻修复手段。运行中 Chromium 拥有的 Cookie 罐无法从插件内直接读取,审计日志是资料支持的观测方式。

适用场景与注意

  • 适合:长期、多次启动 DSH Desktop,且遇到或想预防 431 / Web authentication failed、怀疑 dsh-auth-* 在 127.0.0.1 上堆积的 Host 使用者。
  • 不适合当作唯一手段:若日志显示 pruned 异常增长,说明删除未落盘,应结合客户端/会话侧排查,而非单纯继续调大 maxHeaderSize。
  • 安全与管理:分类为 admin-security;插件修改 Host HTTP 行为与认证相关钩子,安装前请阅读 index.js 与 cordis.patch.yml。不以资料未记载的用户案例或反馈作背书。

结尾

dsh-cookie-sentinel 针对 DSH Desktop 随机端口 + 长寿命 dsh-auth Cookie 的已知组合问题,用「提高 header 上限 + mint 时定点修剪」两条腿,把 431 挡在认证之前,并把 Cookie 罐拉回当前启动规模。需要进一步了解说明与 issue,见 GitHub 仓库 与 SkillHub 目录页。

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

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

小夜