Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 56 additions & 34 deletions 01-tutorials/identity/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,67 +8,67 @@

与传统的微服务不同,真正的企业级 Agent 必须具备 **自主行动能力(Agency)**。而受制于模型能力,Agent 的行为又是不可预测的。这带来了三个核心挑战:

1. **入站安全 (Inbound Security) —— 谁能调用 Agent?**
1. **入站安全 (Inbound Security) —— 谁能调用 Agent?**
* 常见的基于 API Key 的访问方式由于缺乏防重放机制,安全性低。
* 企业往往希望复用既有 IdP ,Agent 需要支持通过 SSO (如飞书) 方式验证用户身份,确保只有授权用户才能发起对话。
2. **出站安全 (Outbound Security) —— Agent 代表谁在操作?**

2. **出站安全 (Outbound Security) —— Agent 代表谁在操作?**
* **凭证泄露风险**:开发者习惯将 API Key 硬编码在 Agent 代码中,这是巨大的安全隐患。
* **权限越界**:当 Agent 访问飞书文档或数据库时,它应该拥有“上帝视角”,还是仅拥有“当前用户”的权限?
* **身份传递**:如何让后端资源知道,这次调用是由“User A”授权“Agent B”发起的?

3. **细粒度权限管控 (Governance) —— 如何管控“黑盒”?**
3. **细粒度权限管控 (Governance) —— 如何管控“黑盒”?**
* Agent 需要细粒度的策略控制,而不是一把梭的 `Admin` 权限。
* 企业 CISO 和安全团队需要知道 Agent 到底访问了什么资源。

## Agent Identity 解决方案

Agent Identity 专为解决上述问题设计,它不是简单的 OAuth 包装,而是为智能体构建的一套完整的**身份治理基础设施**。
![alt text](images/image.png)
![alt text](image.png)
Agent Identity 把“用户 → 应用 → Agent → 资源”的链路拆开治理,并提供一套可复用的安全构件:

- **Inbound 认证**:对接企业现有 IdP(用户池 / OAuth / SSO 等),让“谁能调用 Agent”可配置、可审计。
- **Agent 权威身份**:为 Agent 提供唯一、可验证的身份主体,便于策略绑定与审计归因。
- **Outbound 凭证托管(Token Vault)**:把 OAuth / API Key 的存储、刷新、最小化授权从业务代码中剥离出来;默认做到“凭据不落地”。
- **细粒度权限控制**:基于委托链(Delegation Chain)把“用户权限”和“Agent 权限”组合校验,默认拒绝、按需放开。
- **可观测与审计**:把“谁在什么时候代表谁调用了哪个工具/资源”沉淀为审计事件,方便排障、合规与内控。
**Inbound 认证**:对接企业现有 IdP(用户池 / OAuth / SSO 等),让“谁能调用 Agent”可配置、可审计。
**Agent 权威身份**:为 Agent 提供唯一、可验证的身份主体,便于策略绑定与审计归因。
**Outbound 凭证托管(Token Vault)**:把 OAuth / API Key 的存储、刷新、最小化授权从业务代码中剥离出来;默认做到“凭据不落地”。
**细粒度权限控制**:基于委托链(Delegation Chain)把“用户权限”和“Agent 权限”组合校验,默认拒绝、按需放开。
**可观测与审计**:把“谁在什么时候代表谁调用了哪个工具/资源”沉淀为审计事件,方便排障、合规与内控。

## 实验列表

| 实验 | 说明 | 目录 |
|------|------|------|
| **实验1: 用户池认证** | 使用用户池管控智能体访问 (Inbound 认证) | [tutorial-1-userpool-inbound](./tutorial-1-userpool-inbound/) |
| **实验2: 飞书联合登录** | 使用飞书账号作为企业身份源 (IdP 集成) | [tutorial-2-feishu-idp](./tutorial-2-feishu-idp/) |
| **实验3: 飞书文档访问** | 凭证托管实现安全访问飞书文档 (Outbound 凭证托管) | [tutorial-3-feishu-outbound](./tutorial-3-feishu-outbound/) |
| ------ | ------ | ------ |
| **实验1: 用户池认证** | 使用用户池管控智能体访问 (Inbound 认证) | [01_userpool_inbound](./01_userpool_inbound/) |
| **实验2: 飞书联合登录** | 使用飞书账号作为企业身份源 (IdP 集成) | [02_feishu_idp](./02_feishu_idp/) |
| **实验3: 飞书文档访问** | 配置 Agent 代表用户访问飞书文档 | [03_feishu_outbound](./03_feishu_outbound/) |

## 核心功能

- **身份认证 (Inbound)**: 验证用户身份,只有授权用户才能访问 Agent
- **凭证托管 (Outbound)**: Agent 安全访问飞书等外部服务,凭证由平台管理
- **权限控制**: 基于委托链的细粒度权限,控制 Agent 能访问的资源

**身份认证 (Inbound)**: 验证用户身份,只有授权用户才能访问 Agent
**凭证托管 (Outbound)**: Agent 安全访问飞书等外部服务,凭证由平台管理
**权限控制**: 基于委托链的细粒度权限,控制 Agent 能访问的资源

## 目录结构说明

```
identity/
```bash
03-agentkit-identity/
├── README.md # 本文件
├── tutorial-1-userpool-inbound/ # 实验1: Inbound 认证
├── 01_userpool_inbound/ # 实验1: Inbound 认证
│ ├── README.md # 教程文档
│ ├── main.py # 示例代码
│ ├── pyproject.toml # 依赖配置
│ ├── .env.example # 环境变量模板
│ ├── .env.template # 环境变量模板
│ └── assets/ # 截图和流程图
├── tutorial-2-feishu-idp/ # 实验2: 飞书 IdP 联合登录
│ ├── README.md
│ ├── main.py
│ ├── pyproject.toml
│ ├── .env.example
│ └── assets/
└── tutorial-3-feishu-outbound/ # 实验3: Outbound 凭证托管 (进阶)
└── 02_feishu_idp/ # 实验2: 飞书 IdP 联合登录
├── README.md
├── main.py
├── pyproject.toml
├── .env.example
├── .env.template
└── assets/
└── 03_feishu_outbound/ # 实验3: 飞书文档访问
├── README.md
├── main.py
├── pyproject.toml
├── .env.template
└── assets/
```

Expand All @@ -77,7 +77,7 @@ identity/
### 前置准备

| 项目 | 说明 |
|------|------|
| ------ | ------ |
| **火山控制台账号** | 需要 IDFullAccess、STSAssumeRoleAccess 权限的子账号 |
| **Python 环境** | Python 3.12+ 及 [uv](https://docs.astral.sh/uv/) |
| **飞书账号**(实验2/3) | 用于测试飞书登录和文档访问 |
Expand All @@ -87,10 +87,10 @@ identity/
```bash
# 1. 克隆仓库
git clone https://github.com/volcengine/agentkit-samples.git
cd agentkit-samples/01-tutorials/identity
cd python/01-tutorials/03-agentkit-identity

# 2. 选择实验目录
cd tutorial-1-userpool-inbound # 或其他实验
cd 01_userpool_inbound # 或其他实验

# 3. 配置环境变量
cp .env.example .env
Expand All @@ -107,4 +107,26 @@ uv run veadk web

本教程所有示例均可通过 `uv run veadk web` 在本地运行。

如需部署到 AgentKit Runtime,请参考 [AgentKit Runtime 文档](https://volcengine.github.io/agentkit-sdk-python/content/4.runtime/1.runtime_quickstart.html)。
如需部署到 AgentKit Runtime,请参考 [AgentKit Runtime 文档](https://volcengine.github.io/agentkit-sdk-python/content/4.runtime/1.runtime_quickstart.html)。

## 概述

## 核心功能

## Agent 能力

## 目录结构说明

## 本地运行

## AgentKit 部署

## 示例提示词

## 效果展示

## 常见问题

## 代码许可

本工程遵循 Apache 2.0 License
48 changes: 37 additions & 11 deletions 01-tutorials/identity/tutorial-1-userpool-inbound/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

### 没有认证会怎样?

**场景 1:裸奔的 Agent**
- **场景 1:裸奔的 Agent**

```mermaid
flowchart LR
Expand All @@ -23,22 +23,25 @@ flowchart LR
```

后果:

- 有人写个脚本疯狂调用,你的 API 费用一夜爆炸
- 竞争对手拿你的 Agent 做逆向工程
- 出了安全事故,你不知道是谁干的

**场景 2:Agent 不知道"你是谁"**
- **场景 2:Agent 不知道"你是谁"**

很多 Agent 需要根据用户身份提供个性化服务:

- 查"我的订单" —— 哪个"我"?
- 访问"我的文档" —— 哪个"我"?
- 执行敏感操作 —— 你有权限吗?

没有身份信息,Agent 要么拒绝服务,要么只能提供最基础的公开功能。

**场景 3:审计和合规**
- **场景 3:审计和合规**

安全团队、CISO 会问你:

- 这个 Agent 谁在用?
- 用了多少次?
- 有没有异常调用?
Expand All @@ -57,6 +60,7 @@ flowchart LR
```

这就是 **Inbound(入站)认证** 要解决的事:

1. **认证**:证明"你是你"
2. **授权**:确认"你能用"
3. **传递**:把身份信息带给 Agent
Expand All @@ -66,7 +70,7 @@ flowchart LR
我们提供开箱即用的 **用户池** 方案:

| 能力 | 说明 |
|------|------|
| ------ | ------ |
| **统一用户目录** | 一个地方管理所有能访问 Agent 的用户 |
| **标准协议** | OAuth2/OIDC,不用自己造轮子 |
| **JWT Token** | 无状态认证,高性能,身份信息可传递给 Agent |
Expand Down Expand Up @@ -106,7 +110,7 @@ flowchart TB
- 选择登录属性:用户名 + 手机号
- 点击「确认」

![新建用户池](images/image-2.png)
![新建用户池](images/image-2.png)

3. **新建客户端**
- 进入用户池详情 → 点击「新建客户端」
Expand All @@ -115,13 +119,13 @@ flowchart TB
- 回调地址:`http://127.0.0.1:8000/api/v1/oauth2callback`
- **记录 Client ID 和 Client Secret**

![新建客户端](images/image-3.png)
![新建客户端](images/image-3.png)

4. **创建测试用户**
- 在用户池中选择「用户管理」→「新建用户」
- 设置用户名和临时密码

![创建测试用户](images/image-4.png)
![创建测试用户](images/image-4.png)

### 步骤2: 配置环境变量

Expand Down Expand Up @@ -156,11 +160,11 @@ uv sync
uv run veadk web
```

服务启动后,访问 http://127.0.0.1:8000
服务启动后,访问 <http://127.0.0.1:8000>

### 步骤4: 用户登录体验

1. **访问应用** - 浏览器打开 http://127.0.0.1:8000
1. **访问应用** - 浏览器打开 <http://127.0.0.1:8000>
2. **跳转登录** - 自动跳转到用户池登录页面
3. **输入凭证** - 使用步骤1创建的用户登录
4. **首次修改密码** - 如有要求,设置新密码
Expand Down Expand Up @@ -195,8 +199,8 @@ flowchart LR

---


**关键点说明:**

- `veadk web` 命令自动读取环境变量中的 OAuth2 配置
- 所有请求都会验证 JWT Token
- 未授权请求返回 401 错误
Expand All @@ -214,7 +218,7 @@ flowchart LR
## 常见问题

| 问题 | 解决方案 |
|------|----------|
| ------ | ------ |
| 登录页面一直跳转 | 清除浏览器缓存,检查回调地址配置 |
| Token 过期 | 默认 10 小时有效,可配置刷新机制 |
| 忘记 Client Secret | 在控制台重新生成 |
Expand All @@ -225,3 +229,25 @@ flowchart LR

- [Agent Identity 产品文档](https://www.volcengine.com/docs/identity)
- [VeADK 开发指南](https://volcengine.github.io/agentkit-sdk-python/)

## 概述

## 核心功能

## Agent 能力

## 目录结构说明

## 本地运行

## AgentKit 部署

## 示例提示词

## 效果展示

## 常见问题

## 代码许可

本工程遵循 Apache 2.0 License
1 change: 1 addition & 0 deletions 01-tutorials/identity/tutorial-1-userpool-inbound/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@
# 本地测试入口(可选)
# ============================================================


async def test_agent():
"""本地测试函数(绕过认证,仅用于开发调试)"""
response = await runner.run(
Expand Down
Loading