Repository navigation
Replies: 3 comments
|
同机独立复现(Windows 10.0.26220 · 1. 用与壳完全相同的参数手工拉起 Host,对同一 launch URL 做对照
结论: 2. 修复验证 备份 DELETE FROM cookies WHERE host_key = '127.0.0.1' AND name LIKE 'dsh-auth-%';重启后窗口正常进入(插件更新流程),无新 crash 日志;下一次启动只新增 1 条,
3. 建议修复方向(任选其一,前两条最彻底)
主帖的自查 SQL 很好用,本机按同样方法确认 71 条、 |
|
补充一组实测数据,给修这个问题的人参考。 1. 二分钉死的阈值(不是估算) 自建本地服务做二分探测:
(第一轮我用估算得出「超限 42 字节」,实测却返回 303 成功——因为 Node 限的是整个请求字节数(含请求行),不是仅头部块。所以估算会错,得实测。) 2. 时间咬合 第 71 个 cookie 签发于 19:29:49,首次崩溃于 19:29:49.148 —— 同一秒。 3. 一个缓解时容易踩的坑 在 profile 的 - id: connection
name: @deepseek-ai/dsh-client-connection
config:
trustedHosts: !!js ctx.webStartup.trustedHosts
cookieMaxAgeDays: 1patch 对 config 是整体替换、不是字段合并——只写 另外注意 loader 条目 id ≠ 插件名:条目 id 是 4. 缓解后的已知代价
5. 一个连带的坑,可能值得单开一条 这个 431 崩溃会触发 如果这条还没人报,我可以单独整理一份。——来自一条鱼 |
|
一样的报错/问题 点disable and restart也一样 |

Uh oh!
There was an error while loading. Please reload this page.
[Bug] 桌面端 0.2.1-rc.5:每次启动铸一枚带随机端口的
dsh-auth-*cookie,约 70 次后Cookie头达 16 KB → HTTP 431 → 误报desktop welcome: Web authentication failed,且无法自愈摘要
@deepseek-ai/dsh-desktop每次启动都会给127.0.0.1铸一枚有效期 30 天、名字里含随机端口的认证 cookie。Chromium 的 cookie 库按 host 隔离、不按端口隔离,因此每条新 cookie 都不会覆盖旧的,只会净增。累计到 71 条时Cookie:头约 16,023 B,叠加其余请求头后越过 Node 默认maxHeaderSize = 16384,Host 在进入任何鉴权代码之前直接返回 431;壳层把任何非 2xx 统一翻译成Web authentication failed,用户看到的却是"认证失败"。本文在 0.2.1-rc.5(当前 nightly)上实测复现——已有报告为 rc.2 / rc.3,说明该缺陷跨越了多个版本仍未修复。本机按约 6 次/天的启动频率,约 12 天复发一次。
环境
@deepseek-ai/dsh-desktop0.2.1-rc.5(nightly 通道,app-update.yml中channel: nightly)win32 x64%LOCALAPPDATA%\Programs\DeepSeek Harness(打包版,resources/app.asar)%APPDATA%\@deepseek-ai\dsh-desktop现象
崩溃报告(
logs\crash-2026-10-30T11-53-10-841Z-host.log):对话框里的
Restart与Disable third-party plugins, back up profile patch, and restart全部无效;renderer console 无任何 error 级输出。时间线(2026-10-30,UTC)
~/.dsh/logs/dsh-prompt/*.log出现app.boot)dsh-auth-*被写入(第 71 条)失败时刻的 cookie 库(
Network\Cookies,SQLite):一旦请求头越界,第一个请求就在解析阶段被拒,那个本应下发新 cookie 的 303 根本不会发生——cookie 库只增不减,无法自愈。这解释了为什么"重试"永远无效,以及为什么它会变成不可恢复的状态。
根因
dsh-desktop-host/lib/index.js:342—— Host 用ctx.connection.authenticatedUrl(...)上报 URL,而 Host 以--port 0启动,端口每次随机。dsh-client-connection/lib/index.js:440——authenticatedUrl()追加进程级launchToken。…/index.js:458 authorizeIndex()—— token 命中后返回303+Set-Cookie,cookie 由sessionCookie(cookieName(authority), …)生成。…/index.js:335——cookieName(authority) = "dsh-auth-" + base64url(sha256(authority)),而authority = url.host,包含临时端口。…/index.js:347——Max-Age=2592000(30 天)、HttpOnly、SameSite=Strict、Path=/。…/index.js:546 isAuthenticated()本来就会校验payload.authority与请求是否一致——也就是说,名字里带端口并未提供任何额外安全性,只带来了累积。maxHeaderSize = 16384→ 在鉴权逻辑之前返回431 Request Header Fields Too Large。还有一条让排查更困难的不对称性:
authenticateWebHost()用的是不带 cookie jar 的 Nodefetch(永远拿到 303),而connectDesktopWelcome()用net.fetch(..., {credentials:"include"})(带上整包 cookie)——同一个 URL,两条路径行为完全不同,日志里看不到状态码。复现方法(最小化,无需图形界面自动化)
第一步:证明 Host 侧是健康的(直接 fork 宿主入口,不开任何窗口)
实测:
303/200/ 不带 cookie 时401—— Host 侧完全正确。第二步:对壳层 cookie 库做 A/B(30 行 Electron 主进程,调用与壳层完全相同的语句)
net.fetch结果DELETE FROM cookies WHERE name LIKE 'dsh-auth-%'之后第三步:真实应用验证 —— 清理后启动,
~/.dsh/logs/dsh-prompt/*.log出现app.boot,工作区正常渲染,此后零崩溃报告。排除项
dsh.profile.bundles缩减为["@deepseek-ai/dsh-base","@deepseek-ai/dsh-web-app"]且清空cordis.patch.yml后重试,故障现象完全相同(同一行、同一文案)。插件不是原因。authenticateWebHost()每次都成功(否则会抛另一条错误);失败的是纯本机127.0.0.1请求。app.asar完好,cookie 库在 userData 里,重装会保留那包超限的 cookie。dsh web:绑定固定端口时不复现——cookie 名稳定,每次覆盖同一行。建议修法(按性价比排序)
DesktopHostProcess.start()中、connectDesktopWelcome()之前遍历session.defaultSession.cookies,删掉127.0.0.1/localhost上所有匹配^dsh-auth-且不等于本次 token 的项,jar 恒为 1 条。dsh-auth-+ hash(归一化 host)(或直接用常量名),把完整 authority 留在签名载荷里——isAuthenticated()已能通过payload.authority拒绝跨端口复用,无需靠"名字不同"做隔离。http.createServer({ maxHeaderSize: 64 * 1024 });并且捕获 431 后清理本地认证 cookie 重试一次,而不是让启动直接失败。credentialKey("client-connection","browser-session")这样的落点;secret 稳定后 cookie 值稳定、名字稳定,覆盖逻辑自然生效。Web authentication failed (HTTP 431)。这一条是本缺陷里最贵的成本来源——现有报告几乎都在这句话上走偏过。用户侧临时规避
DeepSeek Harness进程——cookie 库在运行时被独占)。%APPDATA%\@deepseek-ai\dsh-desktop\Network\Cookies。DELETE FROM cookies WHERE host_key='127.0.0.1' AND name LIKE 'dsh-auth-%';(或直接删掉该文件,库里没有别的内容)。本文相对 #9924 / #10632 / #10802 / #10828 / #10830 的增量
71 行、Cookie:头16,023 B,并用真实创建时间算出复发周期(约 12 天,约 6 次启动/天)。附录
附录 A:崩溃报告全文
路径:
%APPDATA%\@deepseek-ai\dsh-desktop\logs\crash-2026-10-30T11-53-10-841Z-host.log(路径中的用户名已脱敏为
<user>,其余原文未改动)三点值得注意:
phase: startup—— 失败发生在启动阶段,尚未进入主窗口。source: host—— 报告由壳层以host名义写出,但真正抛错的是壳层自己(lib/main.js:8886),Host 进程并未崩溃。(no error-level renderer console output was captured)—— 渲染进程根本没起来,所以这里永远是空的;这也解释了为什么只看这份日志无从判断"到底是哪一步失败"。附录 B:同批次崩溃报告清单
%APPDATA%\@deepseek-ai\dsh-desktop\logs\下现存 10 份(应用自身有保留上限,更早的 2 份已被回收):2026-10-30T11-53-10-841Z2026-10-30T12-08-45-061Z2026-10-30T12-26-46-916Z2026-10-30T12-26-51-769Z2026-10-30T12-26-56-783Z2026-10-30T12-27-03-686Z2026-10-30T12-27-07-411Z2026-10-30T13-34-38-322Z--log-net-log启动)2026-10-30T13-35-36-243Z2026-10-30T13-37-12-484Z关键证据:对全部 10 份做
diff比对,只有time:与shell pid:两行不同,其余 17 行逐字一致。示例(11:53 与 12:27:07):即:每次启动都以完全相同的方式、在完全相同的代码行失败,
shell pid每次都变(新进程)、错误不变——这不是偶发,也不是某个进程状态问题。附录 C:Cookie 库统计结果
库文件:
%APPDATA%\@deepseek-ai\dsh-desktop\Network\Cookies(SQLite,53,248 B)统计对象:故障发生时刻的备份
Cookies.bak-20261030-213903C.1 总量与体积
host_key127.0.0.1(库内没有其他任何 cookie)name^dsh-auth-name长度dsh-auth-9 B + base64url(sha256) 43 B)value长度name=value;分隔)Cookie:头合计maxHeaderSizeHost、Accept、Accept-Encoding、请求行等很快吃满)C.2 属性完全一致
说明这些 cookie 是同一段代码、同一套属性批量铸出来的,不存在"某一条坏了"的可能——纯粹是数量问题。
C.3 值格式
所有 value 均以
v1.开头,即encodeCookie()的 browser-session 载荷格式:且
encrypted_value长度全为 0、明文写在value列(这条 Chromium 会话未启用 DPAPI 加密),因此可以直接用 SQL 读出统计。C.4 按日新增(13 天,合计 71 条)
平均 5.9 次/天,跨度 12.0 天(
2026-10-18T08:36:52Z→2026-10-30T09:01:01Z)。10-19 的 17 条对应当天密集安装/切换插件的多次重启。C.5 首尾样例
dsh-auth-0exPercdGwj1vnIcTz9SFcRTWGd-owEQNWZc8Ax73_0dsh-auth-SqQMDV9ACOKRWWm9oJzAZHtOBEZ_fIRBHbz77tVeooEdsh-auth-dIScBybrqDd17QaVHNs4IijZAav-ZrPC-dWc3NCmeP4dsh-auth--XizqJn4VHloCOZJuBPt5LObyYXRUGrmZjVoWK47Jpcdsh-auth-Rc_9upccycBk0L9s1NrLz3pyvMrkezVzP7ZAQfhDchUdsh-auth-6lxpYm4Xw8MqNCb12F2ovt5EZlIYaN05vLs8eUVXifk最后一条(09:01:01.832Z)之后,连续 8 次启动没有再写入任何一条——因为第一个请求在头部解析阶段就被 431 拒绝,那个会下发 cookie 的
303从未发生。这是"不可自愈"的直接证据。C.6 复现前后的对照
net.fetch(url,{credentials:"include"})200431DELETE FROM cookies WHERE name LIKE 'dsh-auth-%'之后)200C.7 自查用 SQL
其他用户可用以下语句确认是否为同一问题(须先完全退出应用,该库在运行时被独占):
All reactions