使用OAuth2.0和OIDC的单点登录
LangSmith 自托管版通过 OAuth 2.0 和 OIDC 提供单点登录(SSO)功能。该功能将身份验证委托给您的身份提供商(IdP),以统一管理对 LangSmith 的访问权限。
我们的实现支持几乎所有符合 OIDC 规范的系统,但存在少数例外情况。 配置完成后,您将看到如下登录界面:

使用客户端密钥(推荐)
默认情况下,LangSmith 自托管版支持 Authorization Code 流程,该流程采用 Client Secret。
在此版本的流程中,您的客户端密钥将安全地存储在 LangSmith 平台(而非前端)中,并用于身份验证及建立认证会话。
要求
LangSmith 目前不支持在自托管环境中从单点登录(SSO)模式切换为基本认证(basic auth)模式。 我们同样不支持在 OAuth 模式下从带客户端密钥(client secret)切换为不带客户端密钥的 OAuth 模式,反之亦然。 最后,我们不支持同时启用基本认证和 OAuth。请在启用 OAuth 时确保已禁用基本认证配置。
- 您的身份提供商(IdP)必须支持
Authorization Code流程,并启用Client Secret。 - 您的身份提供商(IdP)必须支持使用外部发现/颁发者 URL。我们将利用该 URL 来获取您 IdP 所需的路由和密钥。
- 您必须向LangSmith提供
OIDC、email和profile作用域。我们将使用这些作用域来获取您用户所需的用户信息和电子邮件地址。 - 您需要在身份提供商(IdP)中将回调URL设置为
http://<host>/api/v1/oauth/custom-oidc/callback,其中 host 是您为 LangSmith 实例配置的域名或IP地址。用户完成身份验证后,IdP 将通过此地址重定向用户。 - 您需要在
values.yaml文件中提供oauthClientId、oauthClientSecret、hostname和oauthIssuerUrl。此处用于配置您的 LangSmith 实例。
- Helm
- Docker
config:
authType: mixed
hostname: https://langsmith.example.com
oauth:
enabled: true
oauthClientId: <YOUR CLIENT ID>
oauthClientSecret: <YOUR CLIENT SECRET>
oauthIssuerUrl: <YOUR DISCOVERY URL>
oauthScopes: "email,profile,openid"
# In your .env file
AUTH_TYPE=mixed
LANGSMITH_URL=https://langsmith.example.com
OAUTH_CLIENT_ID=your-client-id
OAUTH_CLIENT_SECRET=your-client-secret
OAUTH_ISSUER_URL=https://your-issuer-url
OAUTH_SCOPES=email,profile,openid
会话时长控制
本节中的所有环境变量均适用于 platform-backend 服务,可通过 Helm 中的 platformBackend.deployment.extraEnv 添加。
- 默认情况下,会话长度由身份提供商返回的身份令牌的过期时间控制。
- 大多数配置应使用刷新令牌,以将会话有效期延长至身份令牌过期之后,最长可达
OAUTH_SESSION_MAX_SEC,这可能需要通过在oauthScopes(Helm)或OAUTH_SCOPES(Docker)中添加offline_access作用域来实现。 OAUTH_SESSION_MAX_SEC(默认为1天)可被覆盖,最长可达一周(604800)- 对于不支持刷新令牌的身份提供商配置,将此值设为
OAUTH_OVERRIDE_TOKEN_EXPIRY="true"时,会将会话时长设为OAUTH_SESSION_MAX_SEC,并忽略身份令牌的过期时间。
身份提供商 (IdP) 设置
Google 工作区
您可以将 Google Workspace 用作单点登录(SSO)提供商,通过 OAuth 2.0 和 OIDC 实现,无需 PKCE。
您必须拥有组织的 Google 云平台(GCP)账号的管理员级访问权限,才能创建新项目;或者,您需具备为现有项目创建和配置 OAuth 2.0 凭据的权限。我们建议您为管理访问权限而新建一个项目,因为每个 GCP 项目仅对应一个 OAuth 同意屏幕。
- 创建一个新的 GCP 项目,请参阅 Google 官方文档主题 创建和管理项目
- 创建项目后,请在 Google API 控制台中打开凭据页面(并确保左上角显示的项目正确无误)
- 创建新凭据:
Create Credentials → OAuth client ID - 选择
Web application作为Application type,并为应用程序输入一个名称,例如LangSmith - 在
Authorized Javascript origins中输入您的 LangSmith 实例的域名,例如https://langsmith.yourdomain.com - 在
Authorized redirect URIs中输入您的 LangSmith 实例的域名,后接/api/v1/oauth/custom-oidc/callback,例如:https://langsmith.yourdomain.com/api/v1/oauth/custom-oidc/callback - 单击
Create,然后下载 JSON 文件,或复制并安全地保存Client ID(以.apps.googleusercontent.com结尾)和Client secret。 如有需要,您日后仍可访问这些内容。 - 选择
OAuth consent screen从左侧导航菜单- 选择应用类型为
Internal。如果您选择Public,则任何拥有 Google 账户的用户均可登录。 - 输入一个描述性的
Application name。该名称会在用户登录时显示在授权屏幕上。例如,可使用LangSmith或<organization_name> SSO for LangSmith。 - 请确认 Google API 的作用域(Scopes)仅包含 email、profile 和 openid 这三个作用域。仅需这些作用域即可实现单点登录(SSO)。若您授予额外的作用域,将增加敏感数据泄露的风险。
- 选择应用类型为
- (可选)控制您组织内哪些人员可以访问 LangSmith:https://admin.google.com/ac/owl/list?tab=configuredApps。有关更多详细信息,请参阅 Google 的文档。
- 配置 LangSmith 以使用此 OAuth 应用程序。例如,以下是
config用于 Kubernetes 配置的值:oauthClientId:Client ID(以.apps.googleusercontent.com结尾)oauthClientSecret:Client secrethostname:您的实例所在域名,例如https://langsmith.yourdomain.com(不带末尾斜杠)oauthIssuerUrl:https://accounts.google.comoauth.enabled:trueauthType:mixed
无需客户端密钥(PKCE)(已弃用)
我们建议尽可能使用 Client Secret(此前我们不支持此选项)。但如果您的身份提供商(IdP)不支持该选项,则可以使用 Authorization Code with PKCE 流程。
此流程无需使用 Client Secret —— 请参阅上方的流程,了解需要使用 Client Secret 的替代方案。
要求
在 LangSmith 中使用 OAuth 单点登录(SSO)需满足以下几项要求:
- 您的身份提供商(IdP)必须支持
Authorization Code with PKCE授权流程(例如,Google 不支持此流程,但请参阅下方 的替代配置,该配置为 Google 所支持)。在 OAuth 提供商中,此设置通常显示为配置“单页应用程序(SPA)”。 - 您的身份提供商(IdP)必须支持使用外部发现/颁发者 URL。我们将利用该 URL 来获取您 IdP 所需的路由和密钥。
- 您必须向LangSmith提供
OIDC、email和profile作用域。我们将使用这些作用域来获取您用户所需的用户信息和电子邮件地址。 - 您需要在身份提供商(IdP)中将回调URL设置为
http://<host>/oauth-callback,其中 host 是您为 LangSmith 实例配置的域名或IP地址。用户完成身份验证后,IdP 将通过此地址重定向用户。 - 您需要在
values.yaml文件中提供oauthClientId和oauthIssuerUrl。此处用于配置您的 LangSmith 实例。
- Helm
- Docker
config:
oauth:
enabled: true
oauthClientId: <YOUR CLIENT ID>
oauthIssuerUrl: <YOUR DISCOVERY URL>
# In your .env file
AUTH_TYPE=oauth
OAUTH_CLIENT_ID=your-client-id
OAUTH_ISSUER_URL=https://your-issuer-url