Custom Authentication and Access Control for LangGraph Platform

LangGraph 平台的自定义身份验证和访问控制

4 分钟阅读

今天,我们推出了 LangGraph Cloud 和自托管环境中 Python 部署的自定义身份验证和资源级访问控制。此功能使您可以集成自己的身份验证提供程序,并在 LangGraph 应用程序中直接实现细粒度的访问模式。

为什么需要自定义身份验证?

虽然 LangGraph Cloud 提供了内置的 API 密钥身份验证,但生产环境部署通常需要与现有身份验证系统进行更深入的集成。团队经常需要:

  • 使用他们自己的身份验证提供程序验证凭据
  • 将对话范围限定为特定用户
  • 为最终用户身份验证添加 OAuth 支持
  • 实施基于角色的访问控制 (RBAC)

自定义身份验证提供了与任何身份验证系统集成的底层原语,同时保持了 LangGraph 的简洁性。一个典型的流程如下所示:

您的 LangGraph 中的 @auth.authenticate 处理程序处理步骤 4-6,而您的 @auth.on 处理程序实现步骤 7。继续阅读以了解更多信息!

添加到您的应用程序

该系统围绕 Auth 对象构建,该对象提供两个关键功能:

  1. 身份验证:验证凭据并识别用户。身份验证处理程序(由 @auth.authenticate 标记)接收每个请求并返回一个包含用户身份的 MinimalUserDict
from langgraph_sdk import Auth

auth = Auth()

@auth.authenticate
async def get_current_user(authorization: str | None) -> Auth.types.MinimalUserDict:
    """Validate JWT tokens and extract user information."""
    assert authorization
    scheme, token = authorization.split()
    assert scheme.lower() == "bearer"
    
    # Validate with your auth provider
    user = await validate_token(token)
    return {
        "identity": user["id"],
        "email": user["email"],
        "is_authenticated": True
    }

仅凭身份验证,未提供凭据的请求将被拒绝。但是,经过身份验证的用户仍然能够访问所有资源,因为我们尚未引入任何资源所有权。这是下面授权处理程序的作用。

  1. 授权:控制对特定资源的访问。授权处理程序接收一个包含用户信息(来自您上面的 @auth.authenticate 函数)的 AuthContext,并且可以向资源添加元数据以指示所有权和/或返回控制资源访问的过滤器
@auth.on
async def add_owner(ctx: Auth.types.AuthContext, value: dict):
    """Make resources private to their creator."""
    filters = {"owner": ctx.user.identity}
    metadata = value.setdefault("metadata", {})
    metadata.update(filters)
    return filters

既然已经实现了授权处理程序,资源的元数据将被标记上 “owner” ID,以限制仅对用户创建的线程的访问。

授权事件处理程序有三个主要任务:

  1. 向正在创建的资源添加元数据。
  2. 返回过滤器,以便用户只能访问匹配的资源
  3. 拒绝来自没有此资源或操作权限的用户的请求。

要在您的部署中使用自定义身份验证,请将身份验证配置添加到您的 langgraph.json,指向您的应用程序部署中的 auth 变量名和路径。

{
  "auth": {
    "path": "src/security/auth.py:auth"
  }
}

资源级控制

授权系统提供对 threadsassistantscrons 的细粒度控制(对 store 操作的授权支持即将发布)。您可以为不同的操作实现自定义逻辑,而不是使用单个全局处理程序。

@auth.on.threads.create
async def on_thread_create(ctx: Auth.types.AuthContext, value: Auth.types.on.threads.create.value):
    """Custom logic for thread creation"""
    if not has_permission(ctx.user, "threads:create"):
        raise Auth.exceptions.HTTPException(status_code=403)
    return {"owner": ctx.user.identity}

@auth.on.assistants
async def on_assistants(ctx: Auth.types.AuthContext, value: Auth.types.on.assistants.value):
    """Restrict access to assistants resource"""
    if not is_admin(ctx.user):
        raise Auth.exceptions.HTTPException(status_code=403)

LangGraph 将使用与正在访问的资源和操作最匹配的特定处理程序,并在需要时回退到更广泛的处理程序。对于给定的事件,最多调用一个处理程序。

当前支持

自定义身份验证目前仅适用于 Python 部署。对 JavaScript 部署的支持即将推出。

下一步

最快的入门方法是查看关于实现自定义身份验证的 快速操作指南。我们还提供以下资源:

要了解更多信息,请查看关于自定义身份验证和访问控制的 概念指南,以及关于 auth 对象的 参考文档

另请查看将您的 LangGraph 聊天机器人与 react 前端连接的 全栈模板演示)。

试用一下,并在 GitHub 上分享您的反馈。这是支持更复杂的部署模式的又一步 - 我们很高兴看到您构建的内容!