使用 OAuth2.0 和 OIDC 进行 SSO
LangSmith 自托管版本通过 OAuth2.0 和 OIDC 提供单点登录(SSO)功能。这将把身份验证委托给您的身份提供商(IdP),以便管理对 LangSmith 的访问权限。
我们的实现支持几乎所有符合 OIDC 标准的协议,仅有少数例外。 配置完成后,您将看到如下登录界面:

使用客户端密钥(推荐)
默认情况下,LangSmith 自托管版本支持带有 Client Secret 的 Authorization Code 流程。 在此版本的流程中,您的客户端密钥会安全地存储在 LangSmith 平台(而非前端)上,并用于身份验证和建立认证会话。
需求
LangSmith 目前不支持在自托管环境中从 SSO 切换到基本认证模式。 我们也不支持从带客户端密钥的 OAuth 模式切换到不带客户端密钥的 OAuth 模式,反之亦然。 最后,我们不支持同时启用基本认证和 OAuth。请在启用 OAuth 时确保禁用基本认证配置。
- 您的身份提供商 (IdP) 必须支持使用
Client Secret的Authorization Code流程。 - 您的身份提供商(IdP)必须支持使用外部发现/发行者 URL。我们将使用此 URL 来获取您 IdP 所需的端点和密钥。
- 您必须向 LangSmith 提供
OIDC、email和profile权限范围。我们使用这些范围来获取您用户所需的用户信息和电子邮件地址。 - 您需要将 IdP 中的回调 URL 设置为
http://<host>/api/v1/oauth/custom-oidc/callback,其中 host 是您为 LangSmith 实例配置的域名或 IP。用户认证后,IdP 将在此处进行重定向。 - 您需要提供
oauthClientId、oauthClientSecret、hostname和oauthIssuerUrl到您的values.yaml文件中。这是您配置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 Workspace
您可以使用 Google Workspace 作为单一身份验证 (SSO) 提供商,通过 OAuth2.0 和 OIDC(无需 PKCE)进行集成。
您必须拥有组织 Google Cloud Platform (GCP) 账户的管理员级别权限,才能创建新项目,或者拥有为现有项目创建和配置 OAuth 2.0 凭据的权限。我们建议您创建一个新项目用于管理访问权限,因为每个 GCP 项目只有一个 OAuth 同意屏幕。
- 创建一个新 GCP 项目,请参阅 Google 文档主题 创建和管理项目
- 创建项目后,请在 Google API Console 中打开 凭据 页面(确保左上角的项目正确)
- 创建新凭据:
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 作用域。单点登录仅需这些作用域。如果您授予额外的作用域,会增加暴露敏感数据的风险。
- 将应用程序类型设置为
- (可选) 控制组织内谁可以访问 LangSmith:https://admin.google.com/ac/owl/list?tab=configuredApps。有关更多详细信息,请参阅 Google 的文档。
- 配置 LangSmith 以使用此 OAuth 应用程序。例如,以下是用于 Kubernetes 配置的
config值:oauthClientId:Client ID(以.apps.googleusercontent.com结尾)oauthClientSecret:Client secrethostname: 您实例的域名,例如https://langsmith.yourdomain.com(无尾部斜杠)oauthIssuerUrl:https://accounts.google.comoauth.enabled:trueauthType:mixed
Without Client Secret (PKCE) (已弃用)
我们建议尽可能使用 Client Secret(此前我们不支持此选项)。但是,如果您的 IdP 不支持此选项,您可以使用 Authorization Code with PKCE 流程。
此流程 不 需要 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