Skip to main content

使用 OAuth2.0 和 OIDC 进行 SSO

LangSmith 自托管版本通过 OAuth2.0 和 OIDC 提供单点登录(SSO)功能。这将把身份验证委托给您的身份提供商(IdP),以便管理对 LangSmith 的访问权限。

我们的实现支持几乎所有符合 OIDC 标准的协议,仅有少数例外。 配置完成后,您将看到如下登录界面:

LangSmith UI with OAuth SSO

使用客户端密钥(推荐)

默认情况下,LangSmith 自托管版本支持带有 Client SecretAuthorization Code 流程。 在此版本的流程中,您的客户端密钥会安全地存储在 LangSmith 平台(而非前端)上,并用于身份验证和建立认证会话。

需求

注意

您可以将 基本身份验证 安装升级到此模式,但无法将 无身份验证 安装升级到此模式。 要进行升级,只需删除基本身份验证配置,并添加如下所示所需的配置参数。之后,用户只能通过 OAuth 进行登录。 为了在升级后保持访问权限,您必须能够通过此前通过基本身份验证登录的电子邮件地址使用 OAuth 登录。

警告

LangSmith 目前不支持在自托管环境中从 SSO 切换到基本认证模式。 我们也不支持从带客户端密钥的 OAuth 模式切换到不带客户端密钥的 OAuth 模式,反之亦然。 最后,我们不支持同时启用基本认证和 OAuth。请在启用 OAuth 时确保禁用基本认证配置。

  • 您的身份提供商 (IdP) 必须支持使用 Client SecretAuthorization Code 流程。
  • 您的身份提供商(IdP)必须支持使用外部发现/发行者 URL。我们将使用此 URL 来获取您 IdP 所需的端点和密钥。
  • 您必须向 LangSmith 提供 OIDCemailprofile 权限范围。我们使用这些范围来获取您用户所需的用户信息和电子邮件地址。
  • 您需要将 IdP 中的回调 URL 设置为 http://<host>/api/v1/oauth/custom-oidc/callback,其中 host 是您为 LangSmith 实例配置的域名或 IP。用户认证后,IdP 将在此处进行重定向。
  • 您需要提供oauthClientIdoauthClientSecrethostnameoauthIssuerUrl到您的values.yaml文件中。这是您配置LangSmith实例的位置。
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"

会话长度控制

注意

本节中的所有环境变量均用于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 同意屏幕。

  1. 创建一个新 GCP 项目,请参阅 Google 文档主题 创建和管理项目
  2. 创建项目后,请在 Google API Console 中打开 凭据 页面(确保左上角的项目正确)
  3. 创建新凭据:Create Credentials → OAuth client ID
  4. 选择 Web application 作为 Application type,并为应用程序输入一个名称,例如 LangSmith
  5. Authorized Javascript origins中放入您的 LangSmith 实例的域名,例如https://langsmith.yourdomain.com
  6. Authorized redirect URIs中放入您的 LangSmith 实例的域名,后跟/api/v1/oauth/custom-oidc/callback,例如https://langsmith.yourdomain.com/api/v1/oauth/custom-oidc/callback
  7. 点击 Create,然后下载 JSON 或复制并保存 Client ID(以 .apps.googleusercontent.com 结尾)和 Client secret 到某个安全位置。如果您以后需要,您将能够访问这些内容
  8. 从左侧导航菜单中选择OAuth consent screen
    1. 将应用程序类型设置为Internal如果您选择Public,任何拥有 Google 账户的人都可以登录。
    2. 输入一个描述性的Application name。该名称会在用户登录时显示在同意屏幕上。例如,使用LangSmith<organization_name> SSO for LangSmith
    3. 验证 Google API 的作用域(Scopes)仅列出 email、profile 和 openid 作用域。单点登录仅需这些作用域。如果您授予额外的作用域,会增加暴露敏感数据的风险。
  9. (可选) 控制组织内谁可以访问 LangSmith:https://admin.google.com/ac/owl/list?tab=configuredApps。有关更多详细信息,请参阅 Google 的文档
  10. 配置 LangSmith 以使用此 OAuth 应用程序。例如,以下是用于 Kubernetes 配置的 config 值:
    1. oauthClientId: Client ID(以 .apps.googleusercontent.com 结尾)
    2. oauthClientSecret: Client secret
    3. hostname: 您实例的域名,例如 https://langsmith.yourdomain.com(无尾部斜杠)
    4. oauthIssuerUrl: https://accounts.google.com
    5. oauth.enabled: true
    6. authType: 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 提供 OIDCemailprofile 权限范围。我们使用这些范围来获取您用户所需的用户信息和电子邮件地址。
  • 您需要将 IdP 中的回调 URL 设置为 http://<host>/oauth-callback,其中 host 是您为 LangSmith 实例配置的域名或 IP。用户认证后,IdP 将在此处进行重定向。
  • 您需要在您的values.yaml文件中提供oauthClientIdoauthIssuerUrl。这是配置您的LangSmith实例的地方。
config:
oauth:
enabled: true
oauthClientId: <YOUR CLIENT ID>
oauthIssuerUrl: <YOUR DISCOVERY URL>

此页面有帮助吗?


您可以留下详细的反馈 在 GitHub 上