Skip to main content
上一个教程中,你添加了资源授权功能,为用户提供了私密对话。然而,你仍然在使用硬编码的令牌进行身份验证,这并不安全。现在,你将使用 OAuth2 将这些令牌替换为真实的用户账户。 你将保留相同的 Auth 对象和资源级访问控制,但将身份验证升级为使用 Supabase 作为你的身份提供程序。虽然本教程使用了 Supabase,但这些概念适用于任何 OAuth2 提供程序。你将学习如何:
  1. 将测试令牌替换为真实的 JWT 令牌
  2. 与 OAuth2 提供程序集成以实现安全的用户身份验证
  3. 处理用户会话和元数据,同时保持现有的授权逻辑

背景

OAuth2 涉及三个主要角色:
  1. 授权服务器:身份提供程序(例如 Supabase、Auth0、Google),负责处理用户身份验证并颁发令牌
  2. 应用程序后端:你的 LangGraph 应用程序。它验证令牌并提供受保护的资源(对话数据)
  3. 客户端应用程序:用户与之交互的 Web 或移动应用
标准的 OAuth2 流程大致如下:

先决条件

开始本教程前,请确保:

1. 安装依赖项

安装所需的依赖项。进入你的 custom-auth 目录并确保已安装 langgraph-cli

2. 设置身份验证提供程序

接下来,获取你的身份验证服务器的 URL 和用于身份验证的私钥。 由于你在此使用 Supabase,可以在 Supabase 仪表板中完成此操作:
  1. 在左侧边栏中,点击 ⚙️ “项目设置”,然后点击 “API”
  2. 复制你的项目 URL 并添加到 .env 文件
  1. 复制你的服务角色密钥并添加到 .env 文件:
  1. 复制你的 “anon public” 密钥并记下。稍后设置客户端代码时会用到。

3. 实现令牌验证

在之前的教程中,你使用 Auth 对象来验证硬编码令牌添加资源所有权 现在,你将升级身份验证以验证来自 Supabase 的真实 JWT 令牌。主要更改都将发生在 @auth.authenticate 装饰的函数中:
  • 不再检查硬编码的令牌列表,而是向 Supabase 发起 HTTP 请求来验证令牌。
  • 从已验证的令牌中提取真实的用户信息(ID、邮箱)。
  • 现有的资源授权逻辑保持不变。
更新 src/security/auth.py 以实现此功能:
src/security/auth.py
最重要的变化是,我们现在使用真实的身份验证服务器来验证令牌。我们的身份验证处理程序拥有 Supabase 项目的私钥,可以用来验证用户的令牌并提取其信息。

4. 测试身份验证流程

让我们测试新的身份验证流程。你可以在文件或笔记本中运行以下代码。你需要提供:
  • 一个有效的邮箱地址
  • 一个 Supabase 项目 URL(来自上文
  • 一个 Supabase anon 公钥(同样来自上文
⚠️ 继续之前:检查你的邮箱并点击两个确认链接。在你确认用户邮箱之前,Supabase 将拒绝 /login 请求。 现在测试用户是否只能看到自己的数据。确保服务器正在运行(运行 langgraph dev)后再继续。以下代码片段需要你在设置身份验证提供程序时从 Supabase 仪表板复制的 “anon public” 密钥。
输出应如下所示:
你的身份验证和授权正在协同工作:
  1. 用户必须登录才能访问机器人
  2. 每个用户只能看到自己的线程
所有用户都由 Supabase 身份验证提供程序管理,因此你无需实现任何额外的用户管理逻辑。

后续步骤

你已成功为 LangGraph 应用程序构建了生产就绪的身份验证系统!让我们回顾一下你已完成的工作:
  1. 设置了身份验证提供程序(本例中为 Supabase)
  2. 添加了具有邮箱/密码身份验证的真实用户账户
  3. 将 JWT 令牌验证集成到你的代理服务器中
  4. 实现了适当的授权,确保用户只能访问自己的数据
  5. 创建了一个基础,可以应对下一个身份验证挑战
现在你已拥有生产级身份验证,可以考虑:
  1. 使用你喜欢的框架构建 Web UI(参见 Custom Auth 模板中的示例)
  2. 身份验证概念指南中了解更多关于身份验证和授权的其他方面。
  3. 阅读 参考文档 后,进一步自定义你的处理程序和设置。