dsh-cookie-renew:DSH Web 会话 Cookie 滑动续期

前言

DeepSeek Harness(DSH)的 Web GUI 在首次通过带 ?token= 的启动 URL 访问 GET / 时,会签发名为 dsh-auth-* 的浏览器会话 Cookie。该 Cookie 的有效期由 connection.cookieMaxAgeDays 决定(默认 30 天),且为绝对过期时间:此后端不会自动刷新。即便用户几乎每天都打开界面,一旦累计存活时间超过该上限,仍须重新打开带 token 的启动链接才能登录。

对于长期开着 Web 控制台、又不想周期性手动换 token URL 的部署方式,需要在 Host 侧介入。下面介绍社区插件 dsh-cookie-renew(维护者 edisoncks,分类 admin-security),它在不自行读签名密钥、不自行签 Cookie 的前提下,借助 DSH 自带的 token 交换逻辑做滑动续期。

这是什么

dsh-cookie-renew 是一个 DSH Host 插件 bundle:在 GUI 使用期间监听 Connection 的 connection/request 瀑布流(包裹每条已通过准入的 /api 请求),当 Cookie 剩余寿命低于总寿命的一定比例时,重新执行 DSH 内部的授权交换,并把新的 Set-Cookie 挂到当前 HTTP 响应上。

一句话:把「一次性 30 天绝对过期」的会话凭证,在活跃使用下变成可续期的会话(具体仍受配置与空闲行为约束,见后文)。

工作原理(摘要)

  1. 每条 /api 请求在写响应前触发 connection/request;插件始终调用 next(),不改变 API 业务逻辑。
  2. 插件根据请求规范化后的 authority(HTTP 为 host:port,TLS 为 https://host[:port])定位对应的 dsh-auth-* Cookie;payload 仅作调度提示,不信任其签名;已过期或异常 payload 的候选会被跳过。
  3. 当 remaining <= lifetime * renewBelowFraction 且距上次 mint 已超过 minIntervalMinutes 时:通过 ctx.connection.authenticatedUrl() 取得进程 launch token,用 ctx.connection.authorizeIndex() 对合成 GET /?token=… 请求执行与 DSH 相同的交换,将捕获的 Set-Cookie 写入真实响应。
  4. Launch token 不落盘;签名密钥在 $DSH_HOME/.credentials.yaml,故 DSH 进程重启后 Cookie 仍可继续工作(在仍有效的前提下)。

续期由 事件驱动,不是定时器:在页面打开且发生 /api 请求时,跨过阈值后的第一次请求触发。默认 30 天寿命、renewBelowFraction: 0.5 时,若几乎每天访问,大约每 15 天续期一次,过期时间大致保持在 15~30 天之间;标签页长期空闲则不会续期,空闲超过整段寿命仍会丢会话。minIntervalMinutes 用于防止短时间重复 mint,不是续期节奏本身。

安装与启用

插件以 bundle 形式发布:package.json 中 dsh.bundle.patch 指向 cordis.patch.yml,通过 insert: 挂载条目;在 profile 的 dsh.profile.bundles 中选中 bundle 才会加载,并在侧边栏 Plugins → Installed plugins 出现开关。

官方推荐固定 tag 安装(勿用 #main,以免下次安装解析到移动中的分支):

dsh plugin --profile web add github:edisoncks/dsh-cookie-renew#v1.0.0

该命令等价于在 ~/.dsh/profiles/web/package.json 写入依赖 github:edisoncks/dsh-cookie-renew#v1.0.0,并把 dsh-cookie-renew 加入 dsh.profile.bundles。若依赖已存在,只需在 bundles 中加入 "dsh-cookie-renew",或在 Installed plugins 打开开关。

安装后重启 dsh web 以挂载插件;已有 Cookie 仍有效,无需重新打开 token URL。Cookie 总寿命仍由 connection 配置的 cookieMaxAgeDays 决定;每次成功续期会从 mint 时刻起重置为该配置的完整天数。

配置

默认配置随 bundle patch 下发;可在 profile 的 cordis.patch.yml 用条目 id 覆盖(不要用 insert: 再插一条,否则会重复条目):

- id: dsh-cookie-renew
  name: dsh-cookie-renew
  config:
    renewBelowFraction: 0.5
    minIntervalMinutes: 60
字段 默认值 含义
renewBelowFraction 0.5 剩余寿命 ≤ 总寿命 × 该比例时尝试续期;取值 (0, 1],1 表示在每个节流窗口内的首次请求即可续期
minIntervalMinutes 60 同一 authority 在此窗口内不重复 mint;0 关闭节流
debug false 为 true 时通过 ctx.logger('cookie-renew') 记录每次成功续期

Host 用 Schemastery 严格校验类型与范围;错误配置会导致该条目不激活并在启动时告警,其余 DSH 仍可运行。插件在 Host 侧注册了 settings 描述符(auto: true),但当前 Web GUI 未附带浏览器表单,实际改参仍以 profile patch 为主。

验证是否加载

  1. 打开 Settings → Built-in plugins → Plugin list,展开 Global,搜索 cookie。应看到 Cookie Renew、条目 id dsh-cookie-renew、模块名与 active fiber。
  2. 侧边栏 Plugins → Installed plugins 中应列出该 bundle,开关对应 dsh.profile.bundles 是否包含 dsh-cookie-renew。

适用场景与注意

适合:长期通过 Web GUI 操作 DSH、希望减少「满 30 天必须重开 token URL」频率的 self-hosted 或内网部署;分类为 admin-security,与会话与准入相关。

务必知晓:

  • 插件以当前 dsh 进程权限 在 Host 内运行;安装前应阅读源码与 MIT 许可证,确认符合你的安全策略。
  • 它不替代首次 token 登录,也不能在标签页完全 idle 整个 Cookie 寿命期间保活。
  • 社区目录 SkillHub 与 DeepSeek / 幻方无官方从属关系;DSH 生态强调「一切皆插件」,本文介绍的是第三方 Host 插件,非内置组件。

结尾

dsh-cookie-renew 在 DSH 已有 token 交换路径上叠加滑动续期,把活跃 Web 会话从固定绝对过期改为「用则续、闲则仍按原寿命失效」。需要固定版本与完整说明时,以 GitHub README 为准:

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

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

小夜