issue: deprecated authlib.jose import warns on startup and breaks the OIDC stale-JWKS retry (wrong BadSignatureError class)

在 Open WebUI 后端启动时(使用 ghcr.io/open-webui/open-webui:dev 镜像或类似环境),每次启动都会记录一条 deprecation 警告。同时,当 OIDC IdP 轮换签名密钥但保留相同的 kid 时,使用缓存的旧 JWKS 进行登录会失败,返回 INV

issue: deprecated authlib.jose import warns on startup and breaks the OIDC stale-JWKS retry (wrong BadSignatureError class)

issue: deprecated authlib.jose import warns on startup and breaks the OIDC stale-JWKS retry (wrong BadSignatureError class)

快速结论:此问题发生在 Open WebUI 后端启动时,出现 AuthlibDeprecationWarning 警告,并导致 OIDC 登录在 IdP 密钥轮换后失败(返回 INVALID_CRED),无法自动刷新 JWKS。优先排查 backend/open_webui/utils/oauth.pyfrom authlib.jose.errors import BadSignatureError 的导入方式,以及 Authlib 和 joserfc 的版本兼容性。

问题场景

在 Open WebUI 后端启动时(使用 ghcr.io/open-webui/open-webui:dev 镜像或类似环境),每次启动都会记录一条 deprecation 警告。同时,当 OIDC IdP 轮换签名密钥但保留相同的 kid 时,使用缓存的旧 JWKS 进行登录会失败,返回 INVALID_CRED,无法自动刷新密钥集并重试。

报错原文

/app/backend/open_webui/utils/oauth.py:19: AuthlibDeprecationWarning: authlib.jose module is deprecated, please use joserfc instead.
It will be compatible before version 2.0.0.
  from authlib.jose.errors import BadSignatureError

原因分析

此问题由两个关联的缺陷组成:

  • Deprecation 警告:代码中使用了 authlib.jose.errors.BadSignatureError,而 Authlib 1.7+ 已弃用 authlib.jose 模块,建议改用 joserfc
  • 功能 bug:backend/open_webui/utils/oauth.pyhandle_callback 函数捕获 authlib.jose.errors.BadSignatureError 来清理过期 JWKS 并重试。但 Authlib >= 1.7 版本中,OIDC 客户端实际通过 joserfc 解码 ID token,会抛出 joserfc.errors.BadSignatureError。这两个异常类具有完全不同的继承体系,导致恢复路径永远不会触发。当 IdP 轮换签名密钥(但重用 kid)时,登录会直接失败返回 INVALID_CRED,而不是刷新 JWKS 并重试。

环境排查

  • 确认 Open WebUI 版本(例如 dev 镜像或具体发行版)
  • 确认 Authlib 版本(问题环境使用了 authlib==1.7.2
  • 确认是否已安装 joserfc(问题环境通过依赖传递安装了 joserfc 1.7.4,但未声明在 requirements.txtpyproject.toml 中)
  • 检查 backend/open_webui/utils/oauth.pyfrom authlib.jose.errors import BadSignatureError 这一行代码

解决步骤

  1. 定位问题文件:打开 backend/open_webui/utils/oauth.py,找到第 19 行或 from authlib.jose.errors import BadSignatureError 所在位置。
  2. 修改导入:from authlib.jose.errors import BadSignatureError 改为 from joserfc.errors import BadSignatureError。由于 joserfc 已在 oauth.py 中被直接使用(例如 JWSRegistryHeaderParameter),此修改与现有代码保持一致。
  3. (可选)更新依赖声明:requirements.txtrequirements-min.txtpyproject.toml 中添加 joserfc 作为显式依赖,以避免传递依赖缺失的风险。
  4. 应用官方修复(推荐):参考 PR #27310 的修改内容,或更新到包含该修复的 Open WebUI 版本。

验证方法

1. 重启 Open WebUI 后端,确认启动日志中不再显示 AuthlibDeprecationWarning: authlib.jose module is deprecated 警告。
2. 配置一个 OIDC 提供商,轮换 IdP 签名密钥但保留相同 kid,然后使用缓存的旧 JWKS 进行登录。确认登录成功(触发 JWKS 刷新和重试),而不是返回 INVALID_CRED 错误。

参考来源

open-webui/open-webui #27309

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

celebrityanime
celebrityanime
文章: 14702

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注