You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
顺带说明:这台机器上还出现过一次无关的崩溃(bili-native-dsh: 1 signed scheme(s) were refused … sdk-hmac-sha256 (https://snap-access.cn-north-4.myhuaweicloud.com) + ERR_INVALID_STATE: ReadableStream is already closed),属第三方层,仅备注以免与本问题混淆。
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
TL;DR
@deepseek-ai/dsh-desktop每次启动都给127.0.0.1铸一枚 30 天有效、名字里带 authority(含端口) 的认证 cookie,而 Chromium 的 cookie 库只按 host 隔离、不按端口隔离 —— 于是每启动一次永久多一条,永不回收。累积到 71 条时,发往 Host 的Cookie:头达到 16,316 B,越过 Node 默认maxHeaderSize = 16,384 B,Host 在任何鉴权代码执行前直接回 431;桌面壳的net.fetch拿到非 2xx,抛出desktop welcome: Web authentication failed,窗口停在DeepSeek Harness is unavailable,且每次重试只会再加一条,永远无法自愈。修法最省事的只有一句:启动握手前把不属于本次 token 的
dsh-auth-*cookie 删掉(把 jar 锁死在 1 条)。环境
@deepseek-ai/dsh-desktop0.2.1-rc.2(内含@deepseek-ai/dsh-desktop-runtime0.2.1-rc.2)D:\X\xxrj\DeepSeek(打包版,resources/app.asar)%APPDATA%\@deepseek-ai\dsh-desktop现象
窗口文案:
对话框里的
Restart、Disable third-party plugins, back up profile patch, and restart全部无效。崩溃日志(
logs\crash-2026-10-24T00-59-41-903Z-host.log,4 分钟内 6 份,内容逐字相同):renderer console 无任何 error 输出。
根因
DesktopHostProcess.start()以--port 0启动 Host,端口每次随机(本机看到过 3351 / 5093 / 8828 / 14512 …)。dsh-desktop-host/lib/index.js:342通过ctx.connection.authenticatedUrl(...)拿到带 launch token 的 URL 回给 Electron。BrowserAuth.authorizeIndex()用 token 换 cookie:其中
cookieName(authority) = "dsh-auth-" + base64url(sha256(authority)),而authority由Host头推出、包含端口;Max-Age=2592000(30 天)、HttpOnly、SameSite=Strict。Chromium 的 cookie 库以 host 为键 → 每次启动端口不同 ⇒ cookie 名不同 ⇒ 不会被覆盖,只会新增;30 天内不清理,且每次请求都会被一起发出去(
last_access_utc全库同一时刻,可佐证「全量发送」)。累计到 71 条时,
Cookie:头 ≈ 16.3 KB。Host 是 Node http 服务器,默认maxHeaderSize = 16384,在解析阶段就回 431 Request Header Fields Too Large。桌面壳两条请求路径差异是关键:
authenticateWebHost()用不带 cookie jar 的 Nodefetch(只发一个 token)→ 永远 303 成功;connectDesktopWelcome()用net.fetch(...)(credentials: "include")→ 带上整包 cookie → 431;所以 431 被伪装成「认证失败」,日志里看不到状态码。
实测:阈值两边都验证过
单独起同一个 Host(
dsh-desktop-host/lib/index.js,随机端口),只改Cookie:头大小:200(正常返回 index)dsh-auth-*200dsh-auth-*431401(正常走鉴权)431两个结论:
失败机型上的 cookie 库现场(
%APPDATA%\@deepseek-ai\dsh-desktop\Network\Cookies):71 行,全部dsh-auth-*,全部host_key='127.0.0.1',value明文约 171–173 B,encrypted_value长度 0,除此之外库里没有别的内容。反向验证
--user-data-dir=<空目录>→ 正常进工作区 ⇒ 不是二进制、网络、账号、插件问题,就是 profile 的 cookie jar;Network\Cookies(先备份,其余 profile 一律不动、代码零改动)→ 重启后握手401 → 200,窗口正常显示会话标题,此后零 crash log。为什么这是个「不可恢复」的坑
Web authentication failed让人往账号 / 代理 / 插件 / 重装方向排查,日志里没有 431、没有状态码;Restart和「禁用第三方插件重启」都绕不过这一层;补充:浏览器端
dsh web绑固定端口时不复发(cookie 名不变 ⇒ 每次覆盖同一条),所以这是 desktop 独占路径;不影响任何网站登录态,也不影响 profile / 插件 / 会话。建议修法(任一条即可堵住,按性价比排序)
host.start()之前遍历session.defaultSession.cookies,删掉127.0.0.1/localhost上所有name匹配^dsh-auth-且不等于本次 token 的项;jar 从此恒为 1 条。isAuthenticated()正常拒绝,不需要靠「名字不同」来隔离。credentialKey("client-connection", "browser-session")这类落点,把 secret 持久化后 cookie 值稳定、名字稳定,覆盖逻辑自然生效。http.createServer({ maxHeaderSize: 64 * 1024 });或捕获 431 后清库再重试一次,而不是直接让启动失败。connectDesktopWelcome()抛错时带上状态码(... Web authentication failed (HTTP 431))。这一条是本 bug 里最贵的成本来源。临时规避(用户侧)
DeepSeek Harness进程);%APPDATA%\@deepseek-ai\dsh-desktop\Network\Cookies(文件在运行中被独占,必须关掉应用才能操作);name LIKE 'dsh-auth-%'的行);与已有讨论的关系
同一台机器同一原因,社区已有两份报告,本文的增量是把阈值两边直接实测出来(他们是推算):
Light-EI)lingxujp,已自带启动前清库的 launcher)另有第三方同因记录:TommyFang2077/dsh-linux-desktop#40、Minglink/DeepSeek-Harness-Desktop#2(后者的「
net.fetch不读 session cookie store」为第二缺陷的说法与上表矛盾:若成立,1 条 cookie 时就该 401,且只删 cookie 不应能恢复)。完整复现命令与给上游的报告稿(官方 Issues 已关闭,故另存一份):Xmiss9/wanwan#1
All reactions