快速结论:当 Hugging Face Space 以 iframe 形式嵌入 huggingface.co、而浏览器限制第三方 Cookie 时(典型场景是隐身/无痕窗口),Gradio 的 OAuth 登录会话无法建立,表现为每次登录成功后立即被遗忘、OAuth 反复重启。优先排查会话 Cookie 能否在 iframe 内被写入,以及第三方 Cookie 限制设置。
适用环境:Gradio(Issue 中涉及 6.26.0 与仍可复现的 6.31.0);框架环境为 Hugging Face Space 被 huggingface.co 以 iframe 嵌入;复现浏览器为 Chromium 156(通过 Network.setCookieControls 限制第三方 Cookie)。Issue 中的 System Info 为 n/a,未提供操作系统、Python、CUDA 或显卡信息。
最快修复方案:暂无确认的一步修复方案。Issue 中提到的修复方向是给 session Cookie 加上 Partitioned(CHIPS)属性,但该改动仅存在于 fork 分支、尚未合入上游,属于“可优先尝试”的方向,而非已验证的发行版修复。
注意事项:#13641 发布的修复合入了 Gradio 6.26.0,但它只是清除过期 session Cookie,并在超过 MAX_REDIRECTS 后跳出 iframe 到直接的 *.hf.space URL,属于逃生通道而非真正修复;Issue 报告方确认 6.31.0 仍可复现。加 Partitioned 的改动会影响原有 Cookie 清理逻辑(带该属性与不带该属性的 Cookie 被视为不同 Cookie),且 Safari 不支持该属性,仍需要走直接 URL 流程。
问题场景
用户在 Hugging Face 上通过 iframe 打开一个 Gradio Space,并在工作流中发起 OAuth 登录。在普通窗口中正常,直接访问 Space 的 *.hf.space URL 也正常;但在隐身/无痕窗口(或启用了第三方 Cookie 限制的浏览器配置)中,登录重定向无法完成,登录成功后会话立刻丢失,OAuth 反复重启。
报错原文
oauth in iframed spaces broken in incognito
when logging in via workflow, redirect doesn't work via incognito. the browser blocks the session cookie because the app is loaded inside an iframe on huggingface.co, so each successful login is immediately forgotten and OAuth restarts.
原因分析
Space 由 <user>-<space>.hf.space 提供,而 Hub 在 huggingface.co 上以 iframe 嵌入它。由于 hf.space 在 Public Suffix List 中,每个 Space 主机都是独立站点,attach_oauth() 安装的 session Cookie 在该 iframe 中属于第三方 Cookie。attach_oauth() 已设置 SameSite=none; Secure,但这对限制第三方 Cookie 的浏览器(如 Issue 报告的隐身模式)并不充分:浏览器会直接丢弃 Set-Cookie,会话从一开始就不存在,因此也没有可清除的过期 Cookie。Issue 的实测表明,将 Cookie 标记为 partitioned 后,在第三方 Cookie 被阻止的情况下仍能登录,说明真正起作用的正是该属性。
环境排查
- 确认 Gradio 版本:6.26.0 引入的 #13641 未覆盖本问题,Issue 报告方在 6.31.0 上仍能复现。
- 确认访问方式:是否通过 huggingface.co 上嵌入的 iframe 访问 Space,而非直接打开
*.hf.spaceURL。 - 确认浏览器第三方 Cookie 策略:隐身/无痕窗口通常默认阻止第三方 Cookie;可用开发者工具或
Network.setCookieControls检查该限制是否生效。 - 确认 Starlette 版本:
partitioned参数在 Starlette 1.7.0 才加入SessionMiddleware,而 Gradio 允许starlette>=1.0.1,需要特性检测而非直接假定可用。 - 确认 Python 版本:
Response.delete_cookie(partitioned=...)仅 Python 3.14+ 可用,而 Gradio 支持 3.10+。
解决步骤
- 先做定位验证:在隐身窗口通过 iframe 访问 Space 触发 OAuth。若登录后会话立即丢失,而直接打开
*.hf.spaceURL 正常,则与 Issue 描述一致。 - 临时绕过(Issue 已验证可用):在隐身模式下改为直接访问 Space 的
*.hf.spaceURL 继续 OAuth 流程,避开第三方 Cookie 限制。 - 可优先尝试的修复方向:让 OAuth session Cookie 携带
Partitioned(CHIPS)属性,使浏览器按嵌入站点(huggingface.co)分区存储该 Cookie。Issue 作者在 fork 分支 fix/oauth-partitioned-session-cookie 中实现了该改动并附带测试与 changeset,但尚未合入上游。 - 若自行实现,需同时处理两点:一是对 Starlette 的
partitioned支持做特性检测(或提升requirements.txt中的版本下限);二是 #13641 的过期 Cookie 清理也要带上Partitioned属性,否则无法清除已分区的同名 Cookie,并且在升级前后两种变体都要过期处理,以免升级后旧 Cookie 残留。
验证方法
在 Chromium 中限制第三方 Cookie、从另一站点以 iframe 嵌入运行修改后的 Gradio。若未分区时表现为匿名、会话丢失,而分区后可以保持登录状态,即说明修复生效。Issue 中同一 iframe 内的对照探针在不带该属性时仍报告被阻止,可作为限制是否真正生效的参照。另外应确认现有 OAuth 安全测试仍全部通过(Issue 中 TestOAuthSecurity 9/9 通过)。Safari 不遵循 Partitioned,需继续使用直接 URL 流程;Firefox 的 Total Cookie Protection 本身已对第三方 Cookie 分区,该属性为正收益或无变化。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[Bug]: /v1/messages answers 503 "authentication database is temporarily unreachable" when the upstream call fails](https://www.chat-gpts.plus/wp-content/uploads/2026/11/49998-bcb7d5b1-768x403.jpg)
![Misc. bug: [SYCL] CPY to q4_1/q5_1/q8_0 doesn't match CPU reference](https://www.chat-gpts.plus/wp-content/uploads/2026/11/31140-0ca3be80-768x403.jpg)
