Skip to main content

使用OAuth2.0和OIDC的单点登录

LangSmith 自托管版通过 OAuth 2.0 和 OIDC 提供单点登录(SSO)功能。该功能将身份验证委托给您的身份提供商(IdP),以统一管理对 LangSmith 的访问权限。

我们的实现支持几乎所有符合 OIDC 规范的系统,但存在少数例外情况。 配置完成后,您将看到如下登录界面:

LangSmith UI with OAuth SSO

使用客户端密钥(推荐)

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

要求

笔记

您可以将基础身份验证安装升级为此模式,但无法将无身份验证安装进行升级。 要执行升级,请直接移除基础身份验证配置,并按下方所示添加所需配置参数。之后,用户仅可通过OAuth方式登录。 为确保升级后仍能正常访问,您必须能够使用此前曾通过基础身份验证登录过的邮箱地址,通过OAuth方式完成登录。

警告

LangSmith 目前不支持在自托管环境中从单点登录(SSO)模式切换为基本认证(basic auth)模式。 我们同样不支持在 OAuth 模式下从带客户端密钥(client secret)切换为不带客户端密钥的 OAuth 模式,反之亦然。 最后,我们不支持同时启用基本认证和 OAuth。请在启用 OAuth 时确保已禁用基本认证配置。

  • 您的身份提供商(IdP)必须支持 Authorization Code 流程,并启用 Client Secret
  • 您的身份提供商(IdP)必须支持使用外部发现/颁发者 URL。我们将利用该 URL 来获取您 IdP 所需的路由和密钥。
  • 您必须向LangSmith提供OIDCemailprofile作用域。我们将使用这些作用域来获取您用户所需的用户信息和电子邮件地址。
  • 您需要在身份提供商(IdP)中将回调URL设置为 http://<host>/api/v1/oauth/custom-oidc/callback,其中 host 是您为 LangSmith 实例配置的域名或IP地址。用户完成身份验证后,IdP 将通过此地址重定向用户。
  • 您需要在 values.yaml 文件中提供 oauthClientIdoauthClientSecrethostnameoauthIssuerUrl。此处用于配置您的 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 工作区

您可以将 Google Workspace 用作单点登录(SSO)提供商,通过 OAuth 2.0 和 OIDC 实现,无需 PKCE。

笔记

您必须拥有组织的 Google 云平台(GCP)账号的管理员级访问权限,才能创建新项目;或者,您需具备为现有项目创建和配置 OAuth 2.0 凭据的权限。我们建议您为管理访问权限而新建一个项目,因为每个 GCP 项目仅对应一个 OAuth 同意屏幕。

  1. 创建一个新的 GCP 项目,请参阅 Google 官方文档主题 创建和管理项目
  2. 创建项目后,请在 Google API 控制台中打开凭据页面(并确保左上角显示的项目正确无误)
  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 这三个作用域。仅需这些作用域即可实现单点登录(SSO)。若您授予额外的作用域,将增加敏感数据泄露的风险。
  9. (可选)控制您组织内哪些人员可以访问 LangSmith:https://admin.google.com/ac/owl/list?tab=configuredApps。有关更多详细信息,请参阅 Google 的文档
  10. 配置 LangSmith 以使用此 OAuth 应用程序。例如,以下是config 用于 Kubernetes 配置的值:
    1. oauthClientIdClient ID(以.apps.googleusercontent.com结尾)
    2. oauthClientSecretClient secret
    3. hostname:您的实例所在域名,例如 https://langsmith.yourdomain.com(不带末尾斜杠)
    4. oauthIssuerUrl: https://accounts.google.com
    5. oauth.enabledtrue
    6. authTypemixed

无需客户端密钥(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提供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 上.