30 秒看懂
Keycard 的 Kim Maida 演示如何通过范围受限的令牌交换和审计记录,保留智能体与用户的身份。Temporal 的 Mason Egger 随后演示费用结算工作流如何在工作进程被终止后恢复,同时让演示中的凭据不进入事件历史。
- 1共享密钥掩盖身份使用宽权限 API 密钥的智能体可能继承全部权限,同时无法说明实际用户或智能体是谁。
- 2每一跳使用不同令牌智能体交换主体令牌以访问 MCP 服务器;服务器再交换令牌访问账本 API。
- 3可审计的费用审批演示记录费用由谁提交、由谁审批,并执行不同的审批限额。
- 4恢复被终止的工作进程演示中,Temporal 重放工作流历史并在重启后继续,不重复已经完成的工作。
- 5让凭据不进入历史即时获取凭据的拦截器使演示凭据不会出现在工作流事件记录中。
要点建议
- 共享 API 密钥可能掩盖操作人身份,还会让智能体获得超出单次调用所需的权限。
- 令牌交换可以将智能体与获委托的用户绑定到短时、限定资源的凭据,并传递到下游。
- 身份信息使审批限额、职责分离和有意义的审计记录成为可能。
- 持久化工作流可以在工作进程故障后恢复已完成的进度,而不必重头开始。
- 工作流历史中的凭据和其他敏感数据需要专门处理。
按章节阅读整理后的全文
共享 API 密钥的风险
Maida 解释宽权限密钥带来的身份缺失和权限过大问题。
Keycard 的 Kim Maida 和 Temporal 的 Mason Egger 介绍一场工作坊,展示如何构建既能安全访问资源、又能在故障后继续运行的智能体。Maida 先讲身份与授权,Egger 随后演示持久化执行。
Maida 指出,一种常见做法是直接给智能体 API 密钥。密钥可能无法标识用户或智能体,而智能体会继承密钥上的全部权限。处处增加人工审批也不是完整答案:人会犯错,很多智能体还需要自主运行。
委托身份与令牌交换
用户授予范围受限的访问权限,智能体交换令牌以访问 MCP 服务器和下游账本 API。
Keycard 采用 OAuth 令牌交换。首先,授权服务器验证用户身份;用户同意把自己的一部分权限委托出去。服务器签发的令牌标识用户及其授予的访问范围。这一步同意流程首先缩小了智能体代表用户行事的权限。
工作坊使用包含 LangChain 智能体的 Expense Desk 应用。其 MCP 客户端将模型提出的工具调用发送给费用 MCP 服务器,后者连接账本 API 和数据库。运行时向模型发送提示词、调度工具调用、把结果返回模型,并重复这个循环,直到智能体作出回答。
用户令牌成为主体令牌,用于标识智能体代表谁行事。Expense Desk 应用是可以发起交换请求的 OAuth 客户端;MCP 服务器还能再发起一次交换以访问账本 API。类似客户端也可以是网关或编程智能体外面的包装程序。
智能体提出工具调用时,应用使用客户端凭据或工作负载身份向 Keycard 的安全令牌服务认证,并提交主体令牌,请求获得针对这一次调用的 MCP 服务器访问权限。请求结合了智能体身份、用户身份以及用户委托的权限。
服务根据策略评估请求:谁在代表谁请求访问、目标资源是什么、需要什么权限。如果委托链和权限都符合策略,服务就签发限定用于 MCP 服务器的短时令牌。Maida 说,这类令牌通常几分钟内过期,不应保存。

MCP 服务器验证令牌并授权工具调用,然后为账本 API 发起第二次令牌交换。Keycard 再次应用策略,签发限定下游资源和调用范围的令牌。服务器用凭据调用 API,调用结束后丢弃令牌;结果再沿智能体调用链返回。
配置费用处理智能体
工作坊从共享密钥转向智能体身份、依赖注册与逐次调用的令牌请求。
两位讲者使用共享工作坊环境演示费用审批智能体。初始版本没有登录,用户通过 API 密钥访问共享 MCP 服务器。费用台允许提交和审批报销,但活动记录无法可靠地把这些操作归属于某个人或某个独立智能体。
Maida 提交了一笔 75 美元的零食费用,并审批另一笔费用。活动记录显示的是通过 API 密钥访问,而不是可识别的提交人和审批人。提示词里声称某人执行了操作,本身也不能证明实际授权者的身份。
下一步是给智能体建立身份。在 Keycard 中,应用注册用于请求令牌,资源注册则表示令牌接收方;同一个组件可以同时是应用和资源。Maida 注册 Expense Desk 智能体应用,又单独把智能体注册为能接收登录令牌的资源。
Maida 将资源与应用关联,使应用能够交换发给该资源的登录令牌。接着她声明智能体的依赖:智能体资源、预先配置好的费用 MCP 服务器、保存在 Keycard 凭据库中的 LLM API 凭据,以及用户信息端点。
演示为智能体创建客户端 ID 和密钥,并将其写入本地沙箱配置。Maida 明确指出这是工作坊中的简化做法;在生产环境中,可以考虑工作负载身份或动态注入凭据的机制,以免把密钥保存在磁盘上。
完成注册后,应用代码还需要真正请求交换令牌。Maida 打开工作坊的检查点代码:MCP 工具集使用 Keycard SDK 在每次工具调用时请求令牌,并把访问权限限定在该次调用所需的范围。
签发函数还处理没有用户登录的情况:智能体使用客户端凭据授权方式认证,以自身身份行事。切换到新检查点并重启服务后,Maida 询问应用当前使用哪个身份,以及该身份的审批限额。
演示识别出 Expense Desk 智能体,并显示其审批限额为 50 美元。Maida 让它提交一笔 75 美元费用,提示词里说这是代表她提交的。由于此时没有人类用户登录,活动记录把提交行为归属于智能体;提示词里的说法不能证明用户身份。
在审计日志中,Maida 找到智能体使用客户端凭据获得 MCP 资源令牌的记录。接着她查看第二次交换:MCP 服务器代表智能体请求访问账本 API。委托链记录了发起请求的应用和下游资源。
人类委托与审计轨迹
用户登录后,系统同时保留人类和智能体身份。费用限额与日志显示每个行为由谁执行。
智能体既可以代表自己行事,也可以代表人类行事而不冒充人类。Maida 加入用户登录,使系统能够将操作归属于某个具体智能体,并注明它代表哪位用户、使用了该用户委托的哪些权限。
登录后,应用识别出 Maida 的人类身份,并显示她的审批限额为 100 美元。此前使用 API 密钥创建的历史记录仍归属于密钥;加入身份机制不会追溯还原过去的操作者。适当情况下,智能体仍然可以使用自己的身份行事。
Maida 提交一笔 30 美元的办公用品费用。由于金额低于演示中的 50 美元门槛,活动记录显示人类提交了费用,而智能体以自己的权限审批。记录区分了两位行为主体,并给出审批理由。
一笔 75 美元费用超过智能体的自主审批限额,因此保持待审。Maida 要求批准自己的费用时,演示拒绝并要求另一位审核人处理。系统能执行这一限制,是因为它知道相关身份;随后它又以她的身份记录了对他人费用的驳回。
Keycard 审计界面显示第一跳:智能体应用代表已登录用户请求 MCP 凭据。第二跳中,MCP 服务器代表该用户请求账本凭据。Maida 解释,可以利用同一个会话标识符追踪这两次交换。
用 Temporal 持久化智能体执行
Egger 解释工作流和活动,并演示工作进程被终止后的恢复。
Egger 接过演示,讨论架构的另一个方面:如何让智能体在故障中可靠运行。他介绍 Temporal 是持久化执行框架,可以维护执行状态、在故障后重建状态,并为分布式调用提供重试等错误处理机制。
智能体循环会反复调用模型和外部工具,因此既有模型特有问题,也会遇到普通分布式系统的问题。在 Egger 的例子中,外层智能体流程是 Temporal 工作流,单次工具或服务调用是活动。活动发生故障后,可以依工作流策略重试。
结算工作流调用扣记账本和标记费用已结算等活动,并用计时器模拟等待。代码在活动周围使用 Keycard 提供的拦截器:活动执行时才获取所需身份和权限,从而允许不同工作进程拥有相互隔离的身份和权限范围。

Temporal 采用工作进程与服务的模型:服务跟踪工作流执行及状态,工作进程运行实际代码。Egger 启动一个工作进程并发起结算;日志显示活动执行和令牌签发,Temporal 界面则显示正在运行的工作流。
他在结算过程中终止工作进程。进程消失后,执行历史仍记录已完成的账本扣记及结果。等待超时后,他重新启动工作进程;Temporal 根据历史重建工作流并继续。在这次演示中,已经完成的活动和 LLM 调用没有重新执行。

持久化很重要,因为智能体循环可能包含许多外部调用和昂贵的模型 token。没有持久化的执行状态和恢复逻辑,长流程接近结束时发生故障,就可能浪费已完成的工作。Egger 表示,如果中断足够短,恢复可以让用户无感;较长的故障仍可能被用户察觉。
保护凭据与数据负载
集成在事件历史之外提供凭据;负载编码可以保护其他敏感数据。
这个例子使用的凭据没有写入 Temporal 事件历史。Egger 检查记录的活动结果,解释说 Keycard 拦截器在需要时即时提供凭据,而不是将其持久化到工作流历史。这是该集成的设计特点,并不保证任意应用数据都不会被记录。

对于其他敏感数据负载,Egger 介绍了 Temporal 的负载编码与加密方式:应用可以在数据到达服务前加密,并自行控制密钥。他最后总结各组件的分工:身份和范围受限的授权控制资源访问,持久化执行帮助智能体在故障后继续工作。
同频道的其他文章
23:05ZH
14:58EN → 简体中文
17:27EN → 简体中文
18:13EN → 简体中文
14:04EN → 简体中文
17:52EN → 简体中文