Repository navigation
Replies: 2 comments
|
2026-10-27 独立复现,结论与本贴一致。这里补本贴缺的一环:431 的直接抓包证据。 环境:Windows 11 Home 26H2 (build 26300.9711) x64 · DSH 桌面端 0.2.1-rc.3 · Electron 44.7.0 · Node 24.21.0。 一、431 的直接证据(netlog)桌面壳接受 Chromium 的 解析
netlog 会把 Cookie 头的内容打码,但保留长度,这正好把「累积到 16 KB」这一步坐实:16,086 B 的 Cookie 头 + 请求行 + 其余头 > Node 本贴给的边界证据是「cookie 时间戳停在最后一次成功启动」——那是间接推断;上面这条是同一请求的请求头长度与响应码,可以直接定位到 header 上限那一层。 二、一个更容易误导人的细节:认证其实"成功了一半"同一次启动里,两步走的是两套网络栈:
所以 补充一条自测办法:把这两步分开看即可验证——用不带 cookie 罐的方式请求同一地址仍然 303,而带罐的第一次请求返回 431。 三、修复建议(在原贴四条基础上补两条)
四、目前没有已修版本
五、用户侧临时缓解清
|
|
独立复现(Windows 10 x64,DSH 桌面端 0.2.1-rc.3 / Electron 44.7.0 / Node 24.21.0),结论与 OP 及 @transmerger 一致:71 枚越线,Cookie 头 16,186 B(比楼上 netlog 的 16,086 B 略高,差异来自当时 cookie 值长度)。 门槛我也实测了一次(对运行中的宿主逐字节二分):
即失败发生在 Node 补一条不需要用户手工清库的客户端止血方案(已在 rc.3 实测生效)在 try {
const stale = (await session.defaultSession.cookies.get({}))
.filter((cookie) => cookie.name.startsWith("dsh-auth-"));
for (const cookie of stale) {
const host = (cookie.domain ?? "127.0.0.1").replace(/^\./, "");
await session.defaultSession.cookies.remove(
`${cookie.secure ? "https" : "http"}://${host}${cookie.path || "/"}`,
cookie.name
);
}
// 自检:删完再读一次,仍有残留就整库兜底,不依赖 remove() 的匹配细节
const leftBehind = (await session.defaultSession.cookies.get({}))
.filter((cookie) => cookie.name.startsWith("dsh-auth-"));
if (leftBehind.length > 0)
await session.defaultSession.clearStorageData({ storages: ["cookies"] });
} catch {}几个必须注意的点:
实测结果
改 这只是止血,不是修复它每次启动清一次,代价是每次都要重新认证一次(本来也要认证),语义不变,但属于用户侧侵入式改动,且应用更新会覆盖补丁。 根本修法仍是 OP 的第 1 条:让 cookie 名与端口解耦( 另外强烈赞同 @transmerger 的第 6 条: |
Uh oh!
There was an error while loading. Please reload this page.
环境
现象
应用完全打不开:点击图标后无窗口,主进程启动即退,连续重试 6 次全崩。
%APPDATA%\@deepseek-ai\dsh-desktop\logs\下的crash-*-host.log全部崩在同一处:重启、重装均无效。唯一恢复手段:完全退出应用后,手工删除
%APPDATA%\@deepseek-ai\dsh-desktop\Network\Cookies(SQLite)里host_key='127.0.0.1' AND name LIKE 'dsh-auth-%'的行,再启动即愈(本例一次删除 71 行后完全恢复)。根因(已定位到包与数据)
@deepseek-ai/dsh-client-connection里cookieName(authority) = 'dsh-auth-' + base64url(sha256(authority)),而authority来自 Host 头=127.0.0.1:<port>。桌面端 GUI 端口每次启动随机 ⇒ 每次启动铸出的 cookie 名字都不同,旧的永远不会被覆盖、只会累积。单枚约 227 B(名 52+值 172),属性Path=/; HttpOnly; SameSite=Strict; Max-Age=3 天。net.fetch+credentials:'include')对本机宿主的每个请求都携带 cookie 罐里全部127.0.0.1的 cookie。累积到 71 枚时 Cookie 头约 16.1 KB,加上请求行与其余头超过 Node HTTPmaxHeaderSize(16,384 B) ⇒ 宿主对一切带 cookie 的请求直接回 431。authenticateWebHost(Node 原生 fetch、无 cookie 罐)照常完成 303+set-cookie;紧接着connectDesktopWelcome(net.fetch、带罐)第一个请求就吃 431 ⇒!response.ok⇒ 抛错 ⇒ 主进程退出。这个「一半通一半死」的不对称在排障时非常有迷惑性。边界证据:cookie 罐里最新一枚的时间戳精确停在最后一次成功启动的时刻;此后每次失败启动都没有新增任何 cookie。
复现
正常使用即可:3 天窗口内累计 70+ 次宿主启动/热重载(插件管理器的安装/卸载操作也会触发 host 重建换端口)。本例一天内攒到 71 枚越线。
修复建议(任一即可止血)
dsh-auth-*补Max-Age=0(或启动握手前清一遍);connectDesktopWelcome失败不要直接崩主进程——捕获后清 origin cookie 重试,或给用户一个可点的恢复入口;给同样中招用户的临时解法
完全退出 DSH(运行中的 Electron 会锁住该 SQLite 文件),然后:
跑完重新启动即可。
All reactions