Repository navigation
桌面端反复启动后 Web 认证失效:dsh-auth-* Cookie 随随机端口累积,请求头超 16 KiB 被 431 拒绝
#10794
Zhang-Lingge
started this conversation in
General
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
环境
@deepseek-ai/dsh0.2.1-rc.2InstallLocation可自定义)现象
桌面端使用若干天后,重新打开时窗口报 "Web authentication failed",界面无法加载。
此时:
Set-Cookie也正确下发;也就是说:不是鉴权失败,是请求头在进入鉴权逻辑之前就被 HTTP 解析器拒掉了。
根因
@deepseek-ai/dsh-client-connection的浏览器会话 Cookie 名称由完整的 authority(含端口) 派生:--port 0),因此authority(127.0.0.1:<port>)每次都变;cookieMaxAgeDays决定,默认 30 天:Path=/、HttpOnly、SameSite=Strict,没有Domain(host-only),因此 127.0.0.1 上的所有端口共用同一个 Cookie 罐;于是 Cookie 罐里
127.0.0.1下的dsh-auth-*条目单调增长,最终 Cookie 请求头超过 Node HTTP 服务端默认的--max-http-header-size= 16384 字节,Host 在解析阶段就返回 431。量化证据
实测 Cookie 库(
%APPDATA%\@deepseek-ai\dsh-desktop\Network\Cookies):dsh-auth-*/host_key=127.0.0.1单条 52(名)+ 171(值)+ 2 ≈ 225 字节;
16384 / 225 ≈ 72.6,即约第 72 条就会越界。阈值实测(手工启动 Host,逐步增大 Cookie 头):
边界正好跨过 16384,确认为 Node 默认头部上限,而非鉴权逻辑。
复现
Network/Cookies中的dsh-auth-*数量;dsh-auth-*(名字不同,端口不同),旧条目不被清理;按本机实际使用频率(6 天 71 条 ≈ 11.8 次/天),约 6 天即可复现。
建议修复(按推荐度)
1. 客户端启动时清理陈旧 authority 的 Cookie(推荐)
修复应落在 Electron 主进程(
dsh-desktop-host),而不是 Host 服务端——服务端无法删除浏览器 Cookie 罐里的条目,主进程可以:在
app.whenReady()之后、创建窗口之前执行一次即可根治,且不影响安全模型(端口仍然参与 Cookie 名与签名 audience,防止其他本地服务复用)。2. 让
cookieMaxAgeDays的默认值与失效速度匹配30 天的有效期对一次性会话凭据明显过长。默认降到 1–3 天可把稳态条目数压到 12–36 条(约 2.7–8 KB),留足余量。Chromium 会在加载 Cookie 库时清理已过期条目,因此缩短 TTL 能真正限制累积。
3. 提高头部上限
为 Host 显式设置
--max-http-header-size(如 64 KiB)只能推迟问题,且 431 的表现对用户很不友好,建议作为兜底而非主解。4. 复用稳定端口
若 Host 能落在固定端口,Cookie 名恒定,浏览器会原地覆盖,条目恒为 1 条。但
WebServer.Config中port为必填且无回退值,端口被占用时会导致启动失败,因此不建议作为默认策略。已采用的临时规避
Network/Cookies删除host_key='127.0.0.1' AND name LIKE 'dsh-auth-%'的行(应用必须完全退出,删除前备份);~/.dsh/profiles/desktop/cordis.patch.yml覆盖connection行,把cookieMaxAgeDays降到 3:已验证该覆盖进入组合结果(
--dump-config中config.cookieMaxAgeDays: 3)并能正常启动。附:诊断线索
cookies.value列(encrypted_value长度 0),因此体积可直接统计。All reactions