SSO 与 OAuth
OAuth 和 Single Sign-On(SSO)为 Open WebUI 提供安全认证。当登录出现问题时,通常都能在下面这些常见原因中找到答案。
常见 OAuth/SSO 问题
1. WebUI URL 未配置
大多数 OAuth 流程都需要应用的外部 URL(redirect URI),这样提供商才能在登录后把用户重定向回来。如果缺失,OAuth 无法完成。
解决方法:
- 前往:Admin Settings > General
- 确认 WebUI URL 已填写,并且指向你的真实部署地址(例如
https://yourwebui.yourdomain.com)
注意拼写错误——OAuth 非常严格。URL 必须完全匹配,包括 https://。
2. 环境变量配置错误
这是 OAuth 失效的最常见原因。环境变量拼写错误、缺失,或使用了错误名称,都会让认证无法工作。
常见环境变量错误:
❌ 人们经常误用的不存在变量:
OIDC_CONFIG→ 应使用OPENID_PROVIDER_URLWEBUI_OIDC_CLIENT_ID→ 应使用OAUTH_CLIENT_IDWEBUI_ENABLE_SSO→ 应使用ENABLE_OAUTH_SIGNUPWEBUI_AUTH_TYPE→ 这个变量不存在——请改用提供商对应的变量OPENID_CLIENT_ID→ 应使用OAUTH_CLIENT_IDOPENID_CLIENT_SECRET→ 应使用OAUTH_CLIENT_SECRET
✅ 正确的 OIDC 变量:
# OIDC 必需
OAUTH_CLIENT_ID=your_client_id
OAUTH_CLIENT_SECRET=your_client_secret
OPENID_PROVIDER_URL=https://your-provider/.well-known/openid-configuration
ENABLE_OAUTH_SIGNUP=true
# 可选但推荐
OAUTH_PROVIDER_NAME=Your Provider Name
OAUTH_SCOPES=openid email profile
OPENID_REDIRECT_URI=https://your-domain/oauth/oidc/callback
# 可选:以 JSON 对象传入提供商特定的 authorize 参数
OAUTH_AUTHORIZE_PARAMS={"prompt":"consent","login_hint":"user@example.com"}✅ Google 特有的可选 authorize 参数:
GOOGLE_OAUTH_AUTHORIZE_PARAMS={"prompt":"consent","login_hint":"user@example.com","hd":"example.com"}✅ 正确的 Microsoft 变量:
MICROSOFT_CLIENT_ID=your_client_id
MICROSOFT_CLIENT_SECRET=your_client_secret
MICROSOFT_CLIENT_TENANT_ID=your_tenant_id
OPENID_PROVIDER_URL=https://login.microsoftonline.com/YOUR_TENANT_ID/v2.0/.well-known/openid-configuration
ENABLE_OAUTH_SIGNUP=true解决方法:
- 始终以官方 环境变量配置文档 为准
- 逐项检查你的部署环境:
- 确认所有必需环境变量都按文档中的精确名字设置
- 如果你是自托管,请确认这些变量已出现在 Docker Compose、Kubernetes manifest 或
.env文件中
- 修改变量后,请重启后端/应用,使新值生效
如果你的提供商在 /authorize 步骤需要额外参数(例如 prompt、login_hint、domain_hint 或 resource),请通过 OAUTH_AUTHORIZE_PARAMS 以 JSON 对象形式传入。
对于 Google 特定定制项,也可以使用 GOOGLE_OAUTH_AUTHORIZE_PARAMS。
大多数 OAuth 错误(循环、401、无响应)都源于环境变量名称错误、完全缺失,或沿用了旧变量名。
Kubernetes/YAML 用户注意: 小心环境变量名尾部的空格。在 YAML 中,如果你把键写成 'OAUTH_CLIENT_ID '(引号内尾部带空格),最终设置出来的变量名就真的是 OAUTH_CLIENT_ID ,Open WebUI 不会识别。请确保环境变量名末尾没有任何空白字符:
# ❌ 错误:引号内尾部多了空格
- name: 'OAUTH_CLIENT_ID '
value: your_client_id
# ✅ 正确:没有尾部空格
- name: OAUTH_CLIENT_ID
value: your_client_id3. 缺少必需变量
OPENID_PROVIDER_URL 对 OIDC 是必需的
很多用户会忘记这个关键变量。缺少它时,OIDC 无法工作。
✅ Microsoft Entra ID:
OPENID_PROVIDER_URL=https://login.microsoftonline.com/YOUR_TENANT_ID/v2.0/.well-known/openid-configuration✅ Google:
OPENID_PROVIDER_URL=https://accounts.google.com/.well-known/openid-configuration✅ Authentik:
OPENID_PROVIDER_URL=https://your-authentik-domain/application/o/your-app-name/.well-known/openid-configuration按提供商分类的其他必需变量:
- 所有 OAuth 提供商:
WEBUI_URL、ENABLE_OAUTH_SIGNUP=true - Microsoft:
MICROSOFT_CLIENT_ID、MICROSOFT_CLIENT_SECRET、MICROSOFT_CLIENT_TENANT_ID - Google:
GOOGLE_CLIENT_ID、GOOGLE_CLIENT_SECRET - OIDC:
OAUTH_CLIENT_ID、OAUTH_CLIENT_SECRET、OPENID_PROVIDER_URL
4. 持久化配置冲突
重要: Open WebUI 中有两个与 OAuth 相关的持久化设置:
ENABLE_PERSISTENT_CONFIG(默认true)——控制所有设置(包括 OAuth)在写入数据库后,是否优先从数据库加载,而不是从环境变量读取。ENABLE_OAUTH_PERSISTENT_CONFIG(默认false)——这是针对 OAuth 设置的额外开关。当它为false时,即使ENABLE_PERSISTENT_CONFIG为true,所有以oauth.开头的配置路径也不会从数据库加载。
默认情况下,因为 ENABLE_OAUTH_PERSISTENT_CONFIG=false,OAuth 环境变量会优先于数据库值。但如果你之前通过 Admin Panel 配过 OAuth,而后面又把 ENABLE_OAUTH_PERSISTENT_CONFIG 设为 true,那么数据库里的旧值就会重新接管。
症状:
- 修改环境变量后,重启仍然不生效
- 之前能登录,改了配置后突然失效
- 重新配置后出现 “No token found in localStorage”
解决方法:
- 开发/测试环境: 保持
ENABLE_OAUTH_PERSISTENT_CONFIG=false(默认就是如此),确保始终从环境变量 读取 - 生产环境: 二选一:
- 通过 Admin Panel 配置 OAuth,而不是依赖环境变量;或
- 保持
ENABLE_OAUTH_PERSISTENT_CONFIG=false(默认),让 OAuth 仍以环境变量为准
- 彻底重来: 删除数据库 volume,用正确配置重新启动
📌 Docker Compose 示例:
environment:
- ENABLE_OAUTH_PERSISTENT_CONFIG=false
- OAUTH_CLIENT_ID=your_client_id
- OAUTH_CLIENT_SECRET=your_secret
- OPENID_PROVIDER_URL=your_provider_url5. 提供商侧 OAuth 配置错误
有时问题不在 Open WebUI,而在身份提供商(如 Google、Okta、Auth0、Azure AD)的应用注册与 Open WebUI 配置不一致 。
解决方法:
- 确认你的应用已在 OAuth 提供商端正确注册,并检查:
- Redirect URI 与真实部署地址完全一致
- OIDC:
https://your-domain/oauth/oidc/callback - Microsoft:
https://your-domain/oauth/microsoft/callback - Google:
https://your-domain/oauth/google/callback
- OIDC:
- Client ID / secret 与环境中填写的值一致
- Scopes 与允许的 grant types(例如
authorization_code)符合 Open WebUI 需求
- Redirect URI 与真实部署地址完全一致
- 查看提供商日志——很多应用注册错误会在那里给出明确原因
📌 Redirect URI 格式示例:
✅ Correct: https://ai.company.com/oauth/oidc/callback
❌ Wrong: https://ai.company.com/oauth/callback/oidc
❌ Wrong: https://ai.company.com/callback
如果不确定,就重新检查提供商应用注册,并在需要时重新生成 client secret。
6. 服务端缓存问题
如果你在使用 Nginx(或其他反向代理)时启用了服务端缓存,OAuth endpoint 可能会出现随机、间歇性的登录问题,而且通常很难排查。
解决方法:
- 在 NGINX(或其他代理)配置中:
- 确认不要缓存以下 endpoint:
/api、/oauth、/callback、/login、/ws、/websocket
- 任何关键登录/认证 endpoint 都必须保持未缓存状态
- 确认不要缓存以下 endpoint:
- 修改后重新加载代理配置
NGINX 示例:
# 为登录 / OAuth / websocket endpoint 关闭缓存
location ~* ^/(api|oauth|callback|login|ws|websocket) {
proxy_no_cache 1;
proxy_cache_bypass 1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_set_header Accept-Encoding "";
}永远不要缓存 OAuth 或登录 endpoint。缓存会导致旧 token 被重复返回,或破坏会话,最终引发难以预测的认证错误。
7. Cookie 配置问题
常见问题: 反向代理里的 cookie 设置,尤其是 HttpOnly 与 SameSite,可能会干扰 OAuth 认证流程。
症状:
- “No token found in localStorage”
- 登录成功后却不断重定向循环
- 认证似乎成功了,但立刻又跳回登录页
解决方法:
对于 NGINX Proxy Manager:
# 删除或调整有问题的 cookie 设置
# ❌ 问题配置:
# proxy_cookie_path / "/; Secure; HttpOnly; SameSite=None";
# ✅ 更合理的配置:
proxy_cookie_flags ~ secure samesite=lax;
# 或者彻底移除 cookie 篡改逻辑环境变量中的 cookie 设置:
WEBUI_SESSION_COOKIE_SAME_SITE=lax
WEBUI_AUTH_COOKIE_SAME_SITE=lax
WEBUI_SESSION_COOKIE_SECURE=true # 如果你使用 HTTP,请改为 false
WEBUI_AUTH_COOKIE_SECURE=true # 如果你使用 HTTP,请改为 false8. 网络超时问题
OAuth 提供商有时响应较慢,导致认证握手阶段超时。
症状:
- 日志中出现
httpcore.ReadTimeout - 出现
CSRF Warning! State not equal in request and response - OAuth 登录偶发性失败
解决方法:
AIOHTTP_CLIENT_TIMEOUT=600
AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST=309. Session State 不匹配(CSRF 错误)
OAuth 重定向过程中,如果 session cookie 没有被正确保留,就会出现这类错误。
症状:
CSRF Warning! State not equal in request and response- 日志中出现
mismatching_state - 认证看似成功,但最后又跳回登录页
解决方法:
- 检查 Cookie 域名 配置:
WEBUI_URL=https://your-exact-domain.com # 必须完全匹配;也请检查 admin panel 中是否保存了不同值- 检查 Session 配置:
WEBUI_SECRET_KEY=your_very_secure_random_key_here
OAUTH_SESSION_TOKEN_ENCRYPTION_KEY=another_secure_key_here10. 负载均衡器与多实例问题
在多实例部署中,如果 OAuth 会话没有正确同步,就会失败。