概述
Token Exchange(令牌交换)是基于 RFC 8693 标准协议的身份认证与授权机制,允许客户端使用一个现有的安全令牌(subject_token)向授权服务器换取一个新的安全令牌。该功能适用于需要身份传递、委托授权及最小权限访问的场景。
本文档介绍如何在 IDaaS 中配置和使用 Token Exchange 功能。如需了解 Token Exchange 的更多概念性内容(如技术原理、应用场景等),请参阅什么是 Token Exchange。
前提条件
已完成 Agent 身份安全配置,详细配置可参考Agent 身份安全配置指导。
Token Exchange 在 Agent 身份安全配置中的 Agent 应用上默认开启,无需单独配置。
使用限制
限制项 | 说明 |
令牌签发限制 | IDaaS 授权服务器仅接受自身签发的令牌进行交换 |
权限限制 | 客户端需具备目标受众和权限范围的授权 |
令牌状态限制 | 主体令牌必须在有效期内且能被正确验证 |
交换次数限制 | 令牌仅支持有限次数的交换,防止无限循环授权 |
令牌类型限制 | 当前仅支持 Access Token 之间的交换 |
操作步骤
步骤一:获取初始访问令牌
在发起令牌交换之前,您需要先获取一个有效的主体令牌(subject_token)。可通过 OAuth 2.0 授权码模式获取。
步骤二:发起令牌交换请求
向 IDaaS 授权服务器的令牌端点发起 POST 请求,交换新的访问令牌。
请求端点
POST https://{domain}/api/v2/iauths_system/oauth2/token其中 {domain} 为您的 IDaaS 实例访问域名。
请求参数
参数 | 类型 | 是否必需 | 示例值 | 说明 |
grant_type | String | 是 |
| 固定值 |
subject_token | String | 是 |
| 代表主体身份的安全令牌 |
subject_token_type | String | 是 |
| 主体令牌类型标识 |
requested_token_type | String | 否 |
| 请求的令牌类型标识,默认为 |
scope | String | 是 |
| 权限范围,格式: |
audience | String | 否 |
| 目标服务的逻辑标识,需与 scope 中的 audience 保持一致 |
client_id | String | 是 |
| 客户端 ID |
client_secret | String | 是 |
| 客户端密钥 |
请求示例
curl --location --request POST 'https://{domain}/api/v2/iauths_system/oauth2/token' \
--data-urlencode 'grant_type=urn:ietf:params:oauth:grant-type:token-exchange' \
--data-urlencode 'subject_token={subject_token}' \
--data-urlencode 'subject_token_type=urn:ietf:params:oauth:token-type:access_token' \
--data-urlencode 'requested_token_type=urn:ietf:params:oauth:token-type:access_token' \
--data-urlencode 'scope={audience}|{scope}' \
--data-urlencode 'audience={audience}' \
--data-urlencode 'client_id={client_id}' \
--data-urlencode 'client_secret={client_secret}'成功响应
{
"access_token": "eyJraWQiOiJBVVRIU0tFWVNYNDZ4bmRLN0RMdmM3NUx5Y0NuYkVFczFWTExQb2tzIiwiYWxnIjoiUlMyNTxxxx...",
"issued_token_type": "urn:ietf:params:oauth:token-type:access_token",
"token_type": "Bearer",
"expires_in": 3600,
"expires_at": 1772605468,
"scope": "user:read"
}响应参数说明
参数 | 类型 | 说明 |
access_token | String | 新颁发的访问令牌 |
issued_token_type | String | 颁发的令牌类型 |
token_type | String | 令牌类型,固定为 Bearer |
expires_in | Integer | 令牌有效期,单位:秒 |
expires_at | Integer | 令牌失效时间戳 |
scope | String | 令牌的权限范围 |
错误码
HTTP 状态码 | 错误码 | 说明 | 解决方案 |
400 | invalid_grant | gant_type 不正确 | 检查gant_type 是否正确 |
400 | invalid_request | 请求参数缺失或格式错误,主体令牌无效 | 检查请求参数是否完整且格式正确,主体令牌是否有效 |
400 | invalid_target | 目标受众或权限范围不合法 | 检查 audience 和 scope 参数是否符合规范 |
401 | unauthorized_client | 客户端未授权 | 检查 client_id 和 client_secret 是否正确 |
步骤三:使用新令牌访问资源
使用交换后的新令牌访问目标资源服务。
curl --location --request GET 'https://{resource_server}/api/protected-resource' \
--header 'Authorization: Bearer {access_token}'其中:
{resource_server}:目标资源服务的访问域名{access_token}:步骤二中获取的新访问令牌
典型应用场景
Agent 身份安全场景
在企业 Agent 服务集成场景中,Token Exchange 可实现安全的身份传递和委托授权。
场景描述
某企业部署了差旅规划助手 Agent 和人力资源 MCP 服务。当员工通过差旅系统访问 Agent 规划行程时,差旅规划助手需要访问人力资源 MCP 服务以获取员工的职级信息和差旅预算等数据。
服务节点对应关系
令牌交换工作流程 | Agent 身份安全场景 |
前端服务(Front Service) | 差旅系统 |
资源服务器 A | 差旅规划助手 Agent |
资源服务器 B | 人力资源 MCP 服务 |
授权服务器 | IDaaS 授权服务器 |
优势
安全地将授权传递到人力资源 MCP 服务
保留业务操作的主体身份信息(员工),无需二次认证授权
完整的授权传递链路,便于溯源和审计
审计与溯源
控制台审计日志
在 IDaaS 控制台日志模块的调用日志中,无论令牌交换请求是否成功,都会记录一条事件类型为"Token 交换"的日志。日志中会记录:
令牌交换的客户端
账户(主体)
主体令牌等核心要素信息
令牌内省能力
IDaaS 令牌交换所颁发的令牌为 JWT 格式,本身具备内省能力。IDaaS 授权服务器在实现令牌交换能力时会自定义一个声明 _idaas_imp 来记录令牌交换的链路。
令牌 Payload 示例
{
"sub": "user_xxxxxxxxxxxxxxxxxxxx",
"scope": "user:read",
"jti": "AT_03",
"iss": "https://{domain}/api/v2/iauths_system/oauth2",
"iat": 1772604268,
"nbf": 1772604268,
"exp": 1772605468,
"aud": "mcp-server",
"client_id": "app_03",
"_idaas_iid": "idaas_xxxxxxxxxxxxxxxxxxxx",
"_idaas_tag": "user-auth",
"_idaas_imp": {
"jti": "AT_02",
"client_id": "app_02",
"_idaas_imp": {
"jti": "AT_01",
"client_id": "app_01"
}
}
}字段说明
字段 | 说明 |
AT_03 和 app_03 | 本次令牌交换颁发的令牌 ID 和发起客户端 ID |
AT_02 和 app_02 | 本次交换使用的主体令牌的 ID 和客户端 ID |
AT_01 和 app_01 | 历史前一次交换的主体令牌 ID 和客户端 ID |