Repository navigation
使用dsh时,无法打开报错问题 #11001
Unanswered
tianjuanquan-prog
asked this question in
Q&A
使用dsh时,无法打开报错问题
#11001
Replies: 1 comment
|
你的分析对,我只补一条和修法有关的。 先说结论一致:cookie 名含随机端口( 补的是另一面:"去掉端口"不是安全的修法。 所以修复应该是"写入时清理同族旧名"(签发新 cookie 后把其它 另外 |
0 replies
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.
DSH Desktop 启动失败(
desktop welcome: Web authentication failed)—— Cookie 累积导致请求头溢出摘要
DSH Desktop 每次启动在本机 loopback 上使用随机端口(
--port 0),会话 cookie 名称由authority(即127.0.0.1:<port>)的 SHA-256 派生,因此每次启动都产生一个名称不同、30 天内不过期的 cookie。由于 cookie 未设置Domain属性(host-only,绑定127.0.0.1,不含端口),浏览器会把所有历史端口留下的 cookie 一并放入发往当前端口的Cookie请求头。累积约 70 条后,
Cookie头接近/超过 Node.js 默认的max-http-header-size(16384 字节),Host 返回431 Request Header Fields Too Large(HPE_HEADER_OVERFLOW),connectDesktopWelcome()收到非 2xx 即抛出desktop welcome: Web authentication failed,应用启动终止。代码中没有任何回收过期/无用 cookie 的逻辑,因此这是必然而非偶发的问题,只是触发时间取决于启动频次。
环境
@deepseek-ai/dsh-desktop0.2.1-rc.2(FileVersion: 0.2.1-rc.2)复现步骤
修复方式(已验证):完全退出应用后,删除
%APPDATA%\@deepseek-ai\dsh-desktop\Network\Cookies与Cookies-journal,重启即恢复。恢复后从 0 条重新累积,约 8 天后再次触发。崩溃栈
crash-2026-10-25T13-33-59-326Z-host.log(10 份日志内容一致):对应的
main.js:8882-8886:此处
send为 Electron 的net.fetch(main.js:12195传入),即携带 Chromium cookie jar。431 属于 4xx,authenticated.ok === false,直接抛错。根因分析(四处代码)
1. 每次启动使用随机端口
dsh/node_modules/@deepseek-ai/dsh-desktop-host/lib/index.js:234-240实测备份中 71 条 cookie 对应 71 个互不相同的端口,一一吻合。
2. cookie 名称绑定 authority(含端口)
dsh/node_modules/@deepseek-ai/dsh-client-connection/lib/index.js:335-337端口不同 → 名称不同 → 旧 cookie 永远不会被同名覆盖。
3. cookie 未设 Domain,浏览器跨端口全量发送
index.js:347-350无
Domain→ host-only cookie,绑定127.0.0.1(不含端口)。Chromium 会把该 host 上、Path=/的全部 cookie 放入任何端口的请求。4. 有效期 30 天,且无任何清理逻辑
index.js:1017在
dsh-client-connection全包内检索以下 API,命中数全部为 0:clearStorageDatacookies.removeremoveAllflushStore主进程中存在两处
clearStorageData(main.js:6960、main.js:10242),但均作用于平台账号登录窗口的独立 partition,与本地 Host 的 cookie 无关,不会清理这里。量化数据(实测)
从用户备份的
Cookies(SQLite,53,248 字节)中解出全部 71 条dsh-auth-*cookie,逐条解析其 payload:Cookie头中总计Cookie头max-http-header-size关键说明(如实标注):单独 71 条 cookie 为 16,117 字节,尚未超过 16,384。但该预算是整个请求头共享的,还需容纳
Host、User-Agent、Accept、Accept-Encoding、Accept-Language、Referer、Sec-Fetch-*(4 项以上)、sec-ch-ua*等,实测同类 Chromium 请求这些字段合计约 600–900 字节。因此总请求头稳定超过上限。阈值估算:16384 ÷ 227 ≈ 72 条(未计其他头部);扣除其他头部后约 68–70 条。
已验证 Node 行为:以 17,000 字节
Cookie头请求本地http.createServer(),服务端clientError返回HPE_HEADER_OVERFLOW,响应 431。为什么现有测试没有覆盖到
packages/client/connection/tests/browser-auth.host.spec.ts共 11 条用例,覆盖篡改、过期、未来签发、超长有效期、HTTPS/HTTP 区分、密钥轮换等。检索结果:multipleaccumul431overflowmaxHeaderold cookie其中第 185 行:
该断言验证的是服务端:携带 A 端口 cookie 访问 B 端口必须被拒。逻辑正确。
但真实故障发生在服务端之前:请求头在 Node HTTP 解析层即被拒绝,不会进入
isAuthenticated()。纯服务端单元测试无法观测到这一层,因此 11 条用例全绿而线上失败。建议修复方向
--port 0改为固定端口,使 cookie 名稳定、可被同名覆盖(最直接)。cookieName()去掉authority中的端口,或直接使用固定名称 + 内容中校验 authority。dsh-auth-*执行cookies.remove,或在clearStorageData({ storages: ['cookies'] })中以 host 为作用域清理。connectDesktopWelcome遇 401/431 时,回退到用 launch token 重新换取 cookie 再重试一次,而非直接终止启动。影响面评估
结论:任何在 30 天内累计启动约 70 次及以上的正常用户都会遇到。这不是个别环境问题——不涉及网络、代理、防火墙、系统时钟或第三方插件(鉴权全程在
127.0.0.1本地回环完成)。触发时间仅取决于使用频率。附:用户侧自助修复步骤
%APPDATA%\@deepseek-ai\dsh-desktop\Network\Cookies%APPDATA%\@deepseek-ai\dsh-desktop\Network\Cookies-journalAll reactions