✨ Admin UI 的 SSO
自 v1.76.0 版本起,SSO 功能对 5 名以下用户免费开放。
使用方法 (Google, Microsoft, Okta 等)
- Okta SSO
- Google SSO
- Microsoft SSO
- 通用 SSO 提供商
第 1 步:在 Okta 中创建 OIDC 应用程序
在您的 Okta 管理控制台中,创建一个新的 OIDC Web 应用程序。详细说明请参阅 Okta 关于创建 OIDC 应用集成的指南。
配置应用程序时
- 登录重定向 URI:
https://<your-proxy-base-url>/sso/callback - 登出重定向 URI (可选):
https://<your-proxy-base-url>
创建应用后,从应用程序的“常规 (General)”选项卡中复制您的 Client ID 和 Client Secret
第 2 步:将用户分配给应用程序
确保在 分配 (Assignments) 选项卡中将用户分配给该应用。如果启用了联合代理模式 (Federation Broker Mode),您可能需要将其禁用才能手动分配用户。
第 3 步:设置环境变量
设置以下环境变量。两种 Okta 授权服务器之间的唯一区别在于端点 URL
组织授权服务器 (Org Authorization Server)(适用于所有 Okta 计划,无需额外 SKU)
GENERIC_CLIENT_ID="<your-client-id>"
GENERIC_CLIENT_SECRET="<your-client-secret>"
GENERIC_AUTHORIZATION_ENDPOINT="https://<your-okta-domain>/oauth2/v1/authorize"
GENERIC_TOKEN_ENDPOINT="https://<your-okta-domain>/oauth2/v1/token"
GENERIC_USERINFO_ENDPOINT="https://<your-okta-domain>/oauth2/v1/userinfo"
PROXY_BASE_URL="https://<your-proxy-base-url>"
自定义授权服务器 (Custom Authorization Server)(需要 Okta API 访问管理 SKU)
GENERIC_CLIENT_ID="<your-client-id>"
GENERIC_CLIENT_SECRET="<your-client-secret>"
GENERIC_AUTHORIZATION_ENDPOINT="https://<your-okta-domain>/oauth2/default/v1/authorize"
GENERIC_TOKEN_ENDPOINT="https://<your-okta-domain>/oauth2/default/v1/token"
GENERIC_USERINFO_ENDPOINT="https://<your-okta-domain>/oauth2/default/v1/userinfo"
PROXY_BASE_URL="https://<your-proxy-base-url>"
您可以在 https://<your-okta-domain>/.well-known/openid-configuration 找到所有的 OAuth 端点
第 3a 步:配置访问策略(仅限自定义授权服务器)
如果您使用自定义授权服务器,则必须配置访问策略。否则,用户将收到 no_matching_policy 错误。如果您使用组织授权服务器,请跳过此步骤。
- 前往 Security(安全) → API
- 选择 default(默认) 授权服务器(或您的自定义服务器)
- 点击 Access Policies(访问策略) 选项卡,创建一个分配给您的 LiteLLM 应用的新策略
- 添加一条允许 Authorization Code(授权码) 授权类型的规则
更多详情请参阅 Okta 访问策略文档。
第 4 步:配置 Okta 安全设置
建议为 Okta 设置 GENERIC_CLIENT_STATE 以防止 CSRF 攻击
GENERIC_CLIENT_STATE="random-string"
PKCE (代码交换证明密钥) — 如果您的 Okta 应用程序配置为需要 PKCE,请通过设置启用它
GENERIC_CLIENT_USE_PKCE="true"
LiteLLM 将在 OAuth 流程中自动处理 PKCE 参数的生成和验证。
第 5 步:测试 SSO 流程
- 启动您的 LiteLLM 代理
- 导航至
https://<your-proxy-base-url>/ui - 点击 SSO 登录按钮
- 使用 Okta 进行身份验证,并验证是否重定向回了 LiteLLM
故障排除
| 错误 | 原因 | 解决方案 |
|---|---|---|
redirect_uri 错误 | 未配置重定向 URI | 在 Okta 的登录重定向 URI 中添加 <proxy_base_url>/sso/callback |
access_denied | 用户未分配到应用程序 | 在“分配”选项卡中分配用户 |
no_matching_policy | 缺少访问策略(仅限自定义授权服务器) | 在授权服务器中创建访问策略(请参阅第 3a 步) |
- 在 https://console.cloud.google.com/ 创建一个新的 OAuth 2.0 客户端
代理所需的 .env 变量
# for Google SSO Login
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
- 在 https://console.cloud.google.com/ 设置 OAuth 2.0 客户端的重定向 URL
- 设置重定向 URL =
<your proxy base url>/sso/callback
https://litellm-production-7002.up.railway.app/sso/callback - 设置重定向 URL =
- 在 https://portal.azure.com/ 创建一个新的应用注册
- 为您的应用注册创建一个客户端密钥 (Client Secret)
代理所需的 .env 变量
MICROSOFT_CLIENT_ID="84583a4d-"
MICROSOFT_CLIENT_SECRET="nbk8Q~"
MICROSOFT_TENANT="5a39737"
可选:自定义 Microsoft SSO 端点
如果您需要使用自定义 Microsoft SSO 端点(例如,用于自定义身份提供商、主权云或代理),您可以覆盖默认端点
MICROSOFT_AUTHORIZATION_ENDPOINT="https://your-custom-url.com/oauth2/v2.0/authorize"
MICROSOFT_TOKEN_ENDPOINT="https://your-custom-url.com/oauth2/v2.0/token"
MICROSOFT_USERINFO_ENDPOINT="https://your-custom-graph-api.com/v1.0/me"
如果未设置这些值,则根据您的租户使用默认的 Microsoft 端点。
- 在 https://portal.azure.com/ 设置应用注册的重定向 URI
- 设置重定向 URL =
<your proxy base url>/sso/callback
https://:4000/sso/callback - 设置重定向 URL =
使用应用角色进行用户权限管理
您可以直接使用 Entra ID 中的“应用角色”分配用户角色。LiteLLM 将自动从 JWT 令牌中读取应用角色并为用户分配相应权限。
支持的角色
proxy_admin- 平台管理员proxy_admin_viewer- 可登录,查看所有密钥,查看所有支出(只读)internal_user- 普通用户。可登录,查看支出,并根据团队成员权限查看/创建/删除自己的密钥。
设置应用角色
- 导航至 https://portal.azure.com/ 上的应用注册
- 转到“应用角色 (App roles)”并创建一个新角色
- 使用上述支持的角色名称之一(例如
proxy_admin) - 在您的企业应用程序中将用户分配给这些角色
- 当用户通过 SSO 登录时,LiteLLM 将自动分配对应的角色
进阶:自定义用户属性映射
对于某些 Microsoft Entra ID 配置,您可能需要覆盖默认的用户属性字段名。当您的组织在 SSO 响应中使用自定义声明或非标准属性名称时,此功能非常有用。
第 1 步:调试 SSO 响应
首先,使用 SSO 调试路由 检查您的 Microsoft SSO 提供商返回的 JWT 字段。
- 将
/sso/debug/callback添加为您 Azure 应用注册中的重定向 URL - 导航至
https://<proxy_base_url>/sso/debug/login - 完成 SSO 流程以查看返回的用户属性
第 2 步:识别字段属性名称
从调试响应中,确定用于电子邮件、显示名称、用户 ID、名字和姓氏的字段名称。
第 3 步:设置环境变量
通过设置以下环境变量覆盖默认属性名称
| 环境变量 | 描述 | 默认值 |
|---|---|---|
MICROSOFT_USER_EMAIL_ATTRIBUTE | 用户电子邮件的字段名称 | userPrincipalName |
MICROSOFT_USER_DISPLAY_NAME_ATTRIBUTE | 显示名称的字段名称 | displayName |
MICROSOFT_USER_ID_ATTRIBUTE | 用户 ID 的字段名称 | id |
MICROSOFT_USER_FIRST_NAME_ATTRIBUTE | 名字的字段名称 | givenName |
MICROSOFT_USER_LAST_NAME_ATTRIBUTE | 姓氏的字段名称 | surname |
第 4 步:重启代理
设置环境变量后,重启代理
litellm --config /path/to/config.yaml
一个通用的 OAuth 客户端,可用于快速支持任何 OAuth 提供商,几乎无需编写代码
代理所需的 .env 变量
GENERIC_CLIENT_ID = "******"
GENERIC_CLIENT_SECRET = "G*******"
GENERIC_AUTHORIZATION_ENDPOINT = "https://:9090/auth"
GENERIC_TOKEN_ENDPOINT = "https://:9090/token"
GENERIC_USERINFO_ENDPOINT = "https://:9090/me"
可选的 .env 变量:以下变量可用于在与通用 OAuth 提供商交互时自定义属性名称。我们将从 SSO 提供商的结果中读取这些属性
GENERIC_USER_ID_ATTRIBUTE = "given_name"
GENERIC_USER_EMAIL_ATTRIBUTE = "family_name"
GENERIC_USER_DISPLAY_NAME_ATTRIBUTE = "display_name"
GENERIC_USER_FIRST_NAME_ATTRIBUTE = "first_name"
GENERIC_USER_LAST_NAME_ATTRIBUTE = "last_name"
GENERIC_USER_ROLE_ATTRIBUTE = "given_role"
GENERIC_USER_PROVIDER_ATTRIBUTE = "provider"
GENERIC_USER_EXTRA_ATTRIBUTES = "department,employee_id,manager" # comma-separated list of additional fields to extract from SSO response
GENERIC_CLIENT_STATE = "some-state" # if the provider needs a state parameter
GENERIC_INCLUDE_CLIENT_ID = "false" # some providers enforce that the client_id is not in the body
GENERIC_SCOPE = "openid profile email" # default scope openid is sometimes not enough to retrieve basic user info like first_name and last_name located in profile scope
通过 SSO 分配用户角色
使用 GENERIC_USER_ROLE_ATTRIBUTE 指定 SSO 令牌中哪个属性包含用户角色。角色值必须是以下受支持的 LiteLLM 角色之一
proxy_admin- 平台管理员proxy_admin_viewer- 可登录,查看所有密钥,查看所有支出(只读)internal_user- 可登录,查看/创建/删除自己的密钥,查看自己的支出internal_user_view_only- 可登录,查看自己的密钥,查看自己的支出
支持嵌套属性路径(例如 claims.role 或 attributes.litellm_role)。
捕获额外的 SSO 字段
使用 GENERIC_USER_EXTRA_ATTRIBUTES 从 SSO 提供商响应中提取标准用户属性(id、email、name 等)之外的额外字段。这在您需要在 自定义 SSO 处理程序 中访问特定于组织的自定义数据(例如部门、员工 ID、组)时非常有用。
# Comma-separated list of field names to extract
GENERIC_USER_EXTRA_ATTRIBUTES="department,employee_id,manager,groups"
在自定义 SSO 处理程序中访问额外字段
from litellm.proxy.management_endpoints.types import CustomOpenID
async def custom_sso_handler(userIDPInfo: CustomOpenID):
# Access the extra fields
extra_fields = getattr(userIDPInfo, 'extra_fields', None) or {}
user_department = extra_fields.get("department")
employee_id = extra_fields.get("employee_id")
user_groups = extra_fields.get("groups", [])
# Use these fields for custom logic (e.g., team assignment, access control)
# ...
嵌套字段路径
支持嵌套字段的点记法
GENERIC_USER_EXTRA_ATTRIBUTES="org_info.department,org_info.cost_center,metadata.employee_type"
- 如果您的提供商需要,请设置重定向 URI
- 设置重定向 URL =
<your proxy base url>/sso/callback
https://:4000/sso/callback - 设置重定向 URL =
默认登录、登出 URL
某些 SSO 提供商需要特定的登录和登出重定向 URL。您可以输入以下值。
- 登录:
<your-proxy-base-url>/sso/key/generate - 登出:
<your-proxy-base-url>
这是在代理上设置登出 URL 的环境变量
PROXY_LOGOUT_URL="https://www.google.com"
第 3 步。在 .env 中设置 PROXY_BASE_URL
在您的 .env 中设置此项(以便代理可以设置正确的重定向 URL)
PROXY_BASE_URL=https://litellm-api.up.railway.app
第 4 步。测试流程
使用 SSO 限制电子邮件子域
如果您正在使用 SSO 并希望仅允许具有特定子域的用户(例如 @berri.ai 电子邮件帐户)访问 UI,请执行此操作
export ALLOWED_EMAIL_DOMAINS="berri.ai"
这将在允许访问之前检查从 SSO 收到的用户电子邮件是否包含此域。
设置代理管理员
启用 SSO 时设置代理管理员。启用 SSO 后,用户的 user_id 将从 SSO 提供商处检索。要设置代理管理员,您需要从 UI 复制 user_id 并将其作为 PROXY_ADMIN_ID 设置在您的 .env 中。
第 1 步:从 UI 复制您的 ID
第 2 步:在您的 .env 中将其设置为 PROXY_ADMIN_ID
export PROXY_ADMIN_ID="116544810872468347480"
这会将 LiteLLM_UserTable 中的用户角色更新为 proxy_admin。
如果您打算更改此 ID,请通过 API /user/update 或 UI(内部用户页面)更新用户角色。
第 3 步:查看所有代理密钥
如果您没有看到所有密钥,这可能是由于令牌缓存。只需重新登录即可生效。
在管理后台禁用 默认团队
如果您想在管理后台隐藏“默认团队”,请使用此功能
将应用以下逻辑
- 如果已分配团队,则不显示
默认团队 - 如果未分配团队,则用户应看到
默认团队
在您的 litellm config.yaml 中设置 default_team_disabled: true
general_settings:
master_key: sk-1234
default_team_disabled: true # OR you can set env var PROXY_DEFAULT_TEAM_DISABLED="true"
在启用 SSO 时使用用户名、密码登录
如果您需要在启用 SSO 时通过用户名/密码访问 UI,请导航至 /fallback/login。此路由允许您使用用户名/密码凭据登录。
限制 UI 访问
您可以将 UI 访问权限限制为仅管理员——包括您(proxy_admin)以及您授予只读访问权限的人员(proxy_admin_viewer,用于查看全球支出)。
第 1 步。设置 'admin_only' 访问权限
general_settings:
ui_access_mode: "admin_only"
第 2 步。邀请只读用户
管理后台自定义品牌
在 LiteLLM 管理后台使用您公司的自定义品牌,我们允许您:
- 自定义 UI Logo
- 自定义 UI 配色方案
设置自定义 Logo
我们允许您传递本地图像或图像的 http/https URL
在您的 env 中设置 UI_LOGO_PATH。我们建议使用托管图像,这样更容易设置、配置和调试
托管图像设置示例
UI_LOGO_PATH="https://litellm-logo-aws-marketplace.s3.us-west-2.amazonaws.com/berriai-logo-github.png"
本地图像设置示例(在您的容器上)
UI_LOGO_PATH="ui_images/logo.jpg"
或者直接从管理后台设置您的 Logo:
设置自定义配色主题
- 导航至 /enterprise/enterprise_ui
- 在
enterprise_ui目录中,将_enterprise_colors.json重命名为enterprise_colors.json - 在
enterprise_colors.json中设置您公司的自定义配色方案。enterprise_colors.json内容示例:将颜色设置为以下任何颜色:https://www.tremor.so/docs/layout/color-palette#default-colors
{
"brand": {
"DEFAULT": "teal",
"faint": "teal",
"muted": "teal",
"subtle": "teal",
"emphasis": "teal",
"inverted": "teal"
}
}
- 部署 LiteLLM 代理服务器
故障排除
“The 'redirect_uri' parameter must be a Login redirect URI in the client app settings” 错误
当重定向 URI 配置不正确时,此错误通常会出现在 Okta 和其他 SSO 提供商中。
问题
Your request resulted in an error. The 'redirect_uri' parameter must be a Login redirect URI in the client app settings
解决方案
1. 确保已在 .env 中设置 PROXY_BASE_URL 且包含协议
确保您的 PROXY_BASE_URL 包含完整的协议 URL (http:// 或 https://)
# ✅ Correct - includes https://
PROXY_BASE_URL=https://litellm.platform.com
# ✅ Correct - includes http://
PROXY_BASE_URL=http://litellm.platform.com
# ❌ Incorrect - missing protocol
PROXY_BASE_URL=litellm.platform.com
2. 对于 Okta,请确保设置了 GENERIC_CLIENT_STATE,并在需要时配置了 PKCE
有关 GENERIC_CLIENT_STATE 和 PKCE 配置的详细信息,请参阅 Okta SSO — 第 4 步:配置 Okta 安全设置。
常见配置问题
Base URL 中缺少协议
# This will cause redirect_uri errors
PROXY_BASE_URL=mydomain.com
# Fix: Add the protocol
PROXY_BASE_URL=https://mydomain.com
回退登录
如果您需要在启用 SSO 时通过用户名/密码访问 UI,请导航至 /fallback/login。此路由允许您使用用户名/密码凭据登录。
调试 SSO JWT 字段
如果您需要检查 LiteLLM 从 SSO 提供商处收到的 JWT 字段,请遵循这些说明。本指南将引导您完成设置调试回调以在 SSO 过程中查看 JWT 数据。
- 将
/sso/debug/callback添加为您 SSO 提供商中的重定向 URL
在 SSO 提供商的设置中,添加以下 URL 作为新的重定向 (回调) URL
http://<proxy_base_url>/sso/debug/callback
-
在浏览器中导航至调试登录页面
在浏览器中导航至以下 URL
要导航到的 URLhttps://<proxy_base_url>/sso/debug/login这将启动标准的 SSO 流程。您将被重定向到 SSO 提供商的登录屏幕,身份验证成功后,您将被重定向回 LiteLLM 的调试回调路由。
-
查看 JWT 字段
重定向后,您应该会看到一个名为“SSO Debug Information”的页面。此页面显示了从您的 SSO 提供商处收到的 JWT 字段(如上图所示)
高级
通过 Azure 应用角色管理用户角色
通过在 Azure Entra ID 中定义用户权限来集中管理角色。当用户登录时,LiteLLM 将根据您的 Azure 配置自动分配角色——无需在 LiteLLM 中手动管理角色。
第 1 步:在 Azure 应用注册上创建应用角色
- 导航至 https://portal.azure.com/ 上的应用注册
- 转到 App roles(应用角色) > Create app role(创建应用角色)
- 使用 支持的 LiteLLM 角色 之一配置应用角色
- 显示名称: Admin Viewer(或您喜欢的显示名称)
- 值:
proxy_admin_viewer(必须与 LiteLLM 角色值完全匹配)
- 点击 Apply(应用) 保存角色
- 对您要使用的每个 LiteLLM 角色重复此操作
支持的 LiteLLM 角色值 (请参阅 完整角色文档)
proxy_admin- 完全管理员访问权限proxy_admin_viewer- 只读管理员访问权限internal_user- 可创建/查看/删除自己的密钥internal_user_viewer- 可查看自己的密钥(只读)
第 2 步:将用户分配给应用角色
- 导航至 https://portal.azure.com/ 上的 企业应用程序
- 选择您的 LiteLLM 应用程序
- 转到 Users and groups(用户和组) > Add user/group(添加用户/组)
- 选择用户
- 在 Select a role(选择角色) 下,选择您创建的应用角色(例如
proxy_admin_viewer) - 点击 Assign(分配) 保存
第 3 步:登录并验证
- 通过 SSO 登录 LiteLLM UI
- LiteLLM 将自动从 JWT 令牌中提取应用角色
- 用户将被分配相应的角色(您可以通过检查用户配置文件下拉菜单在 UI 中验证这一点)
注意: 来自 Entra ID 的角色将覆盖 LiteLLM 数据库中的任何现有角色。这确保了您的 SSO 提供商是用户角色的权威来源。