
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.py 中 from 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.py中handle_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(问题环境通过依赖传递安装了
joserfc1.7.4,但未声明在requirements.txt或pyproject.toml中) - 检查
backend/open_webui/utils/oauth.py中from authlib.jose.errors import BadSignatureError这一行代码
解决步骤
- 定位问题文件:打开
backend/open_webui/utils/oauth.py,找到第 19 行或from authlib.jose.errors import BadSignatureError所在位置。 - 修改导入:将
from authlib.jose.errors import BadSignatureError改为from joserfc.errors import BadSignatureError。由于 joserfc 已在oauth.py中被直接使用(例如JWSRegistry、HeaderParameter),此修改与现有代码保持一致。 - (可选)更新依赖声明:在
requirements.txt、requirements-min.txt或pyproject.toml中添加joserfc作为显式依赖,以避免传递依赖缺失的风险。 - 应用官方修复(推荐):参考 PR #27310 的修改内容,或更新到包含该修复的 Open WebUI 版本。
验证方法
1. 重启 Open WebUI 后端,确认启动日志中不再显示 AuthlibDeprecationWarning: authlib.jose module is deprecated 警告。
2. 配置一个 OIDC 提供商,轮换 IdP 签名密钥但保留相同 kid,然后使用缓存的旧 JWKS 进行登录。确认登录成功(触发 JWKS 刷新和重试),而不是返回 INVALID_CRED 错误。


![[Performance]: Significant performance degradation v1/reranker under concurrent requests while swiching from v.0.19.1 to v0.20.2 v0.21.1](https://www.chat-gpts.plus/wp-content/uploads/2026/07/43444-183a064c-768x403.jpg)
![[CI Failure]: LM Eval PCP (4xB200)](https://www.chat-gpts.plus/wp-content/uploads/2026/07/49334-644d5265-768x403.jpg)