dsh-auth-cookie-guard:Reserving Request Header Budget for Local Listeners and Retiring Old Startup Cookies

前言

DeepSeek Harness(DSH)桌面端每次启动都会在本地随机端口上建监听器,并通过浏览器里的启动 Cookie 完成欢迎页握手。若长期固定同一 profile(同一 userData),Cookie 会在 127.0.0.1 下按域名不断累积,最终把请求 Cookie 头撑过 Node 默认的 16 KiB 上限,握手在 HTTP 解析层以 431 失败,日志里表现为 desktop welcome: Web authentication failed,且重启、撤销授权、重装都无法自愈。社区插件 dsh-auth-cookie-guard(维护者 jitianjiyan)在 Host 侧做两层防护:抬高监听器头部预算,并在每次请求里按规则退休旧启动 Cookie。下面介绍它的定位、机制、安装方式与使用注意。

这是什么

dsh-auth-cookie-guard 是 DSH 社区目录中的客户端(Host)类插件,npm 包名与 bundle 名均为 dsh-auth-cookie-guard,当前发布版本 1.0.6(MIT 许可证)。它只运行在 Host 进程内,没有浏览器端资源,也不提供 service / tool / event。

一句话:为本地 webServer 监听器预留足够大的请求头预算,并在启动后删除不再需要的旧 dsh-auth-* 启动 Cookie,避免固定 profile 连续启动约 72 次后因 431 导致桌面欢迎握手永久失败。

症状与根因(插件要解决的问题)

固定 profile 连续启动约 72 次后,桌面端可能再也进不去;日志常见:

desktop welcome: Web authentication failed(与 connectDesktopWelcome 相关)。换整个 profile(换掉 Chromium cookie 库)才能恢复。

README 归纳的根因链条如下:

  1. Host 每次启动绑定随机端口;会话 Cookie 名称为 dsh-auth-<base64url(sha256(host:port))>。
  2. 浏览器按域名存 Cookie,端口不进键;每启动一次,127.0.0.1 上就多一条约 173 字符、Max-Age 30 天的持久 Cookie,且原先没有删除逻辑。
  3. 建监听器时沿用 Node 默认 maxHeaderSize = 16384 字节。
  4. 累积到第 71 条后,再下发 1 条会使 Cookie 头超过 16384,Node 返回 431;客户端当作认证失败。此后每次启动都超上限,431 在解析层就被拒,应用层没有机会清理——故障是累积型且不可自愈。

核心功能

插件采用两层防护,README 强调缺一不可:

层 行为 默认值
头部预算 webServer 就绪后把 server.maxHeaderSize 提升 maxHeaderBytes: 65536(64 KiB)
退休旧 Cookie 每个请求只读 Cookie 头里符合 dsh-auth- + 43 位 base64url 的名字;按浏览器发送顺序(旧→新)保留最后 keep 条 + 当前端口对应的一条,其余用 Max-Age=0; Path=/ 删除(单响应最多 96 条) keep: 4

设计要点(均来自 README):

  • 只抬预算:约 350 次启动仍会撞墙;只清理不抬预算:431 时清理逻辑跑不到。
  • 只读 Cookie 名字与顺序,从 1.0.4 起不解码值、不写入日志;整包仅 import node:crypto,无网络、文件、子进程。
  • 不参与 DSH 签名校验与登录判断,只删 jar 里本实例不再用的启动 Cookie。
  • 卸载或 dispose 时会还原监听器原始头部预算。

安装与启用

在 DSH 插件页填入 dsh-auth-cookie-guard 安装,或执行:

dsh plugin add dsh-auth-cookie-guard

工具会写入 profile 的 package.json(dsh.profile.bundles 与 npm 依赖);bundle 自带 cordis.patch.yml 作为独立层插入,不要手改 profile 里的 patch 文件。

  • 生效:安装时宿主重载组合,插件当场 apply,一般无需重启桌面端;之后每次启动自动生效。
  • 卸载:在插件管理中移除该 bundle,重启桌面端;头部预算会随 dispose 还原。

开发时可安装仓库源码目录(工具以 link: 引入);发布版走 npm 包 dsh-auth-cookie-guard。

配置

一般使用默认即可。若需在 profile 的 patch 层调整,在该 bundle 条目下增加 config(maxHeaderBytes 会被限制在 16 KiB–1 MiB,keep 在 1–64):

- id: auth-cookie-guard
  name: dsh-auth-cookie-guard
  config:
    maxHeaderBytes: 131072
    keep: 4

若某台机器上 Cookie 已多到超过 64 KiB(约 350 次启动),可临时把 maxHeaderBytes 调到 262144,启动一次让清理跑完,再调回默认。

典型验证方式

README 提供了本地模拟与线上探测思路。安装后 Host 日志可能出现:

auth-cookie-guard: listener header budget 65536 bytes, keeping 4 launch cookie(s)
auth-cookie-guard: retired N launch cookie(s), kept 4

模拟 71 条旧 Cookie + 本轮 1 条时,安装前可能得到 431,安装后握手可通过并当场退休多余条数;第二次请求删除头应幂等。回归测试可通过包内 npm test(14 例,见仓库 test/handshake.test.js)。

复现环境在 README 中注明为 Windows 11、DSH 0.2.1-rc.3、Electron 44.7.0、Node 24.x;插件 engines 要求 ^22.19.0 || >=24.0.0。

适用场景与注意

适合谁:长期固定同一 DSH profile、频繁重启桌面端或 Host,且担心或已遇到欢迎握手失败与 431 累积问题的用户。

安全与边界(安装前建议阅读仓库源码与 MIT 许可证):

  • 插件以当前 DSH Host 进程权限运行,只能看到发往本监听的请求所带的 Cookie。
  • 默认把监听器 maxHeaderSize 提到 64 KiB;若把 DSH 绑到回环之外,远端请求可能多占每连接头部内存——对外暴露时应加反向代理或访问控制,或调低 maxHeaderBytes。
  • 同 host 多实例:浏览器 Cookie 按 host 共享;较旧实例的登录 Cookie 可能被清理,需重新握手;当前实例端口对应 Cookie 始终保留。

DSH 生态是「一切皆插件」;社区目录 SkillHub 插件页 为独立站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-auth-cookie-guard 用「头部预算 + 按序退休启动 Cookie」解决固定 profile 下 Cookie 头膨胀导致的永久 431 锁死,改动集中在 Host 监听器与响应头,对认证语义本身不做重写。需要详情、Issue 与源码时,见 GitHub 仓库:jitianjiyan/dsh-auth-cookie-guard。

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

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

Xiaoye