核心概念
身份验证 vs 授权
虽然这两个术语经常互换使用,但它们代表了不同的安全概念: 在 LangSmith 中,身份验证由你的@auth.authenticate 处理程序处理,授权由你的 @auth.on 处理程序处理。
默认安全模型
LangSmith 提供了不同的安全默认设置:LangSmith
- 默认使用 LangSmith API 密钥
- 需要在
x-api-key请求头中包含有效的 API 密钥 - 可以使用你的身份验证处理程序进行自定义
自定义身份验证
LangSmith 的所有计划都支持自定义身份验证。
自托管
- 无默认身份验证
- 完全灵活,可实施你的安全模型
- 你控制身份验证和授权的所有方面
系统架构
典型的身份验证设置涉及三个主要组件:- 身份验证提供者(身份提供者/IdP)
- 管理用户身份和凭据的专用服务
- 处理用户注册、登录、密码重置等
- 在成功验证后颁发令牌(JWT、会话令牌等)
- 示例:Auth0、Supabase Auth、Okta 或你自己的身份验证服务器
- 代理服务器(资源服务器)
- 你的代理或 LangGraph 应用程序,包含业务逻辑和受保护资源
- 与身份验证提供者验证令牌
- 基于用户身份和权限强制执行访问控制
- 不直接存储用户凭据
- 客户端应用程序(前端)
- Web 应用、移动应用或 API 客户端
- 收集有时效性的用户凭据并发送给身份验证提供者
- 从身份验证提供者接收令牌
- 在向代理服务器发出的请求中包含这些令牌
@auth.authenticate 处理程序处理步骤 4-6,而你的 @auth.on 处理程序实现步骤 7。
身份验证
LangGraph 中的身份验证作为中间件在每个请求上运行。你的@auth.authenticate 处理程序接收请求信息并应:
- 通过
ctx.user给你的授权处理程序 - 在你的应用程序中通过
config["configuration"]["langgraph_auth_user"]
代理身份验证
自定义身份验证允许委托访问。你在@auth.authenticate 中返回的值会被添加到运行上下文中,为代理提供用户范围的凭据,使其能够代表用户访问资源。
身份验证后,平台会创建一个特殊的配置对象,该对象通过可配置上下文传递给你的图和所有节点。
此对象包含有关当前用户的信息,包括你从 @auth.authenticate 处理程序返回的任何自定义字段。
要使代理能够代表用户操作,请使用自定义身份验证中间件。这将允许代理代表用户与外部系统(如 MCP 服务器、外部数据库,甚至其他代理)进行交互。
更多信息,请参阅使用自定义身份验证指南。
使用 MCP 的代理身份验证
有关如何向 MCP 服务器验证代理身份的信息,请参阅 MCP 概念指南。授权
身份验证后,LangGraph 会调用你的@auth.on 处理程序来控制对特定资源(例如,线程、助手、定时任务)的访问。这些处理程序可以:
- 通过直接修改
value["metadata"]字典来添加要在资源创建期间保存的元数据。有关每种操作 value 可以接受的类型列表,请参阅支持的操作表。 - 在搜索/列表或读取操作期间,通过返回过滤器字典来按元数据过滤资源。
- 如果访问被拒绝,则抛出 HTTP 异常。
@auth.on 处理程序。如果你想根据资源和操作进行不同的控制,可以使用资源特定的处理程序。有关支持访问控制的完整资源列表,请参阅支持的资源部分。
资源特定的处理程序
你可以通过将资源名称和操作名称与@auth.on 装饰器链接在一起来为特定资源和操作注册处理程序。
当发出请求时,将调用与该资源和操作匹配的最具体的处理程序。以下是如何为特定资源和操作注册处理程序的示例。对于以下设置:
- 经过身份验证的用户能够创建线程、读取线程以及在线程上创建运行
- 只有具有 “assistants:create” 权限的用户才被允许创建新助手
- 所有其他端点(例如,删除助手、定时任务、存储)对所有用户禁用。
thread 的请求将匹配 on_thread_create 处理程序,但不会匹配 reject_unhandled_requests 处理程序。然而,update 线程的请求将由全局处理程序处理,因为我们没有针对该资源和操作的更具体的处理程序。
过滤器操作
授权处理程序可以返回None、布尔值或过滤器字典。
None和True表示”授权访问所有底层资源”False表示”拒绝访问所有底层资源(抛出 403 异常)”- 元数据过滤器字典将限制对资源的访问
- 默认值是精确匹配的简写,或下面的 “$eq”。例如,
{"owner": user_id}将仅包含元数据为{"owner": user_id}的资源 $eq: 精确匹配(例如,{"owner": {"$eq": user_id}})- 这等同于上面的简写{"owner": user_id}$contains: 列表成员资格(例如,{"allowed_users": {"$contains": user_id}})或列表包含(例如,{"allowed_users": {"$contains": [user_id_1, user_id_2]}})。这里的值必须是列表的一个元素或列表元素的子集。存储资源中的元数据必须是列表/容器类型。
AND 过滤器。例如,{"owner": org_id, "allowed_users": {"$contains": user_id}} 将仅匹配元数据中 “owner” 为 org_id 且 “allowed_users” 列表包含 user_id 的资源。
更多信息,请参阅参考 Auth(Auth)。
常见访问模式
以下是一些典型的授权模式:单所有者资源
这种常见模式允许你将所有线程、助手、定时任务和运行限定为单个用户。它适用于常见的单用户用例,如常规聊天机器人式应用。基于权限的访问
这种模式允许你基于权限控制访问。如果你希望某些角色对资源具有更广泛或更受限制的访问权限,这很有用。支持的资源
LangGraph 提供了三个级别的授权处理程序,从最通用到最具体:- 全局处理程序 (
@auth.on): 匹配所有资源和操作 - 资源处理程序 (例如,
@auth.on.threads,@auth.on.assistants,@auth.on.crons): 匹配特定资源的所有操作 - 操作处理程序 (例如,
@auth.on.threads.create,@auth.on.threads.read): 匹配特定资源上的特定操作
@auth.on.threads.create 在线程创建时优先于 @auth.on.threads。
如果注册了更具体的处理程序,则更通用的处理程序将不会为该资源和操作调用。
支持的操作和类型
以下是所有支持的操作处理程序:“关于运行”运行在访问控制方面限定在其父线程。这意味着权限通常从线程继承,反映了数据模型的对话性质。所有运行操作(读取、列出)除了创建之外,都由线程的处理程序控制。
有一个特定的
create_run 处理程序用于创建新运行,因为它有更多参数,你可以在处理程序中查看。后续步骤
有关实现细节:- 查看关于设置身份验证的入门教程
- 参阅关于实现自定义身份验证处理程序的操作指南
Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

