Skip to content

设置自定义身份验证(第1部分/共3部分)

这是我们的认证系列的第一部分:

  1. 基本认证(您现在的位置)- 控制谁可以访问您的机器人
  2. 资源授权 - 让用户拥有私密对话
  3. 生产认证 - 添加真实用户账户并使用OAuth2进行验证

先决条件

本指南假设您对以下概念有一定的了解:

仅限Python

目前我们只支持在使用langgraph-api>=0.0.11的Python部署中设置自定义认证和授权。对LangGraph.JS的支持将很快添加。

按部署类型支持

自定义认证支持所有托管在**管理型LangGraph云**中的部署,以及**企业级**自托管计划。它不支持**轻量级**自托管计划。

在此教程中,我们将构建一个聊天机器人,该机器人仅允许特定用户访问。我们将从LangGraph模板开始,并逐步添加基于令牌的安全性。最后,您将拥有一款能够检查有效令牌并在允许访问之前进行验证的聊天机器人。

设置项目

首先,让我们使用LangGraph启动模板创建一个新的聊天机器人:

pip install -U "langgraph-cli[inmem]"
langgraph new --template=new-langgraph-project-python custom-auth
cd custom-auth

该模板为我们提供了一个占位符LangGraph应用程序。我们可以通过安装本地依赖项并运行开发服务器来尝试它。

pip install -e .
langgraph dev
如果一切正常,服务器应该启动并在您的浏览器中打开工作室。

这个内存服务器专为开发和测试设计。 对于生产环境,请使用LangGraph云服务。

图谱应该可以运行,如果您在公共互联网上托管此应用,任何人都可以访问它!

无认证

现在我们已经看到了基础的LangGraph应用,接下来让我们为其添加认证功能!

占位符令牌

在第一部分中,我们将从一个硬编码的令牌开始,以供演示之用。 我们将在第三部分中掌握基础知识后,实现一个“生产就绪”的认证方案。

添加认证

Auth 对象允许您注册一个认证函数,该函数将在每个请求时由 LangGraph 平台运行。此函数接收每个请求并决定是否接受或拒绝。

创建一个新的文件 src/security/auth.py。我们的代码将驻留在这个文件中,用于检查用户是否有权限访问我们的机器人:

src/security/auth.py
from langgraph_sdk import Auth

# 这是我们玩具用户数据库。请勿在生产环境中使用这种方式
VALID_TOKENS = {
    "user1-token": {"id": "user1", "name": "Alice"},
    "user2-token": {"id": "user2", "name": "Bob"},
}

# "Auth" 对象是一个容器,LangGraph 将使用它来标记我们的认证函数
auth = Auth()

# `authenticate` 装饰器告诉 LangGraph 在每次请求时调用此函数作为中间件
# 这将确定请求是否被允许
@auth.authenticate
async def get_current_user(authorization: str | None) -> Auth.types.MinimalUserDict:
    """检查用户的令牌是否有效。"""
    assert authorization
    scheme, token = authorization.split()
    assert scheme.lower() == "bearer"
    # 检查令牌是否有效
    if token not in VALID_TOKENS:
        raise Auth.exceptions.HTTPException(status_code=401, detail="Invalid token")

    # 如果有效则返回用户信息
    user_data = VALID_TOKENS[token]
    return {
        "identity": user_data["id"],
    }

请注意,我们的认证处理程序做了两件重要的事情:

  1. 检查请求中的授权头是否提供了有效的令牌。
  2. 返回用户的身份信息。

现在通过在langgraph.json配置文件中添加以下内容,让 LangGraph 使用我们的认证:

langgraph.json
{
  "dependencies": ["."],
  "graphs": {
    "agent": "./src/agent/graph.py:graph"
  },
  "env": ".env",
  "auth": {
    "path": "src/security/auth.py:auth"
  }
}

测试我们的“安全”机器人

让我们重新启动服务器来测试一切!

langgraph dev --no-browser
工作室中的自定义认证

如果没有添加--no-browser选项,工作室UI将在浏览器中打开。你可能会好奇,为什么工作室仍然能够连接到我们的服务器?默认情况下,我们允许从LangGraph工作室访问服务器,即使使用了自定义认证。这使得在工作室中开发和测试你的机器人的过程更加容易。你可以通过在认证配置中设置disable_studio_auth: "true"来移除这个替代认证选项:

{
    "auth": {
        "path": "src/security/auth.py:auth",
        "disable_studio_auth": "true"
    }
}

现在让我们尝试与我们的机器人聊天。如果我们正确实现了认证,那么只有当我们提供了一个有效的token作为请求头时,才能访问机器人。然而,在我们添加资源授权处理器之前,用户仍然可以访问彼此的资源。

认证,无授权处理器

在文件或笔记本中运行以下代码:

from langgraph_sdk import get_client

# 尝试不带token(应该失败)
client = get_client(url="http://localhost:2024")
try:
    thread = await client.threads.create()
    print("❌ 应该没有token无法创建线程!")
except Exception as e:
    print("✅ 正确阻止了访问:", e)

# 尝试带有有效token
client = get_client(
    url="http://localhost:2024", headers={"Authorization": "Bearer user1-token"}
)

# 创建一个线程并聊天
thread = await client.threads.create()
print(f"✅ 以Alice身份创建线程:{thread['thread_id']}")

response = await client.runs.create(
    thread_id=thread["thread_id"],
    assistant_id="agent",
    input={"messages": [{"role": "user", "content": "Hello!"}]},
)
print("✅ 机器人回复:")
print(response)

你应该看到:

  1. 没有有效的token,我们无法访问机器人
  2. 使用有效的token,我们可以创建线程并进行聊天

恭喜你!你已经建立了一个只允许“已验证”用户访问的聊天机器人。虽然这个系统还没有实现生产级别的安全方案,但我们已经了解了如何控制对机器人访问的基本机制。在下一个教程中,我们将学习如何为每个用户提供自己的私人对话。

接下来做什么?

现在你可以控制谁可以访问你的机器人后,你可能还想:

  1. 继续教程,前往使对话私有(第2部分/共3部分),了解资源授权。
  2. 阅读更多关于认证概念的信息。
  3. 查看API参考,了解更多有关认证的细节。

Comments