使用 Bedrock AgentCore 网关实现 ServiceNow 令牌交换
- 作者

- 姓名
- Nino
- 职业
- Senior Tech Editor
构建企业级的AI代理不仅仅是将诸如Claude 3.5 Sonnet之类的大模型连接到LLM API,更需要严格遵守安全协议,例如在调用ServiceNow等下游系统时保留最终用户的身份。传统上,开发人员必须编写自定义的拦截器Lambda函数来管理OAuth 2.0代表用户(OBO)令牌交换。然而,借助Amazon Bedrock AgentCore Gateway,此功能现在已在原生层面进行集成,从而为使用像 n1n.ai 这样可靠的LLM API聚合器的开发人员简化了整个架构。
在这篇深度剖析中,我们将探讨在LLM代理与使用Microsoft Entra ID(前身为Azure AD)的ServiceNow REST API之间,协调无缝用户身份保留工作流所需的架构模式、逐步配置工作流和代码实现。
理解AI网关中的代表用户(OBO)流
当用户与AI代理交互时(无论是通过自定义聊天界面还是企业工作区),请求都携带用户的身份验证令牌,通常是由Microsoft Entra ID等身份提供商(IdP)颁发的JSON Web Token(JWT)。当代理决定调用外部工具(例如在ServiceNow中创建事件)时,该API调用必须以特定用户的权限执行,而不是以通用的服务账户执行。
从历史来看,实现这一点意味着:
- 在应用层捕获传入的用户令牌。
- 通过自定义执行上下文传递该令牌。
- 部署AWS Lambda函数来拦截请求,使用
urn:ietf:params:oauth:grant-type:jwt-bearer授权类型调用Microsoft身份平台的/token端点,并将用户令牌交换为下游访问令牌。 - 将新令牌注入到ServiceNow的授权标头中。
这种架构引入了延迟、维护开销和安全漏洞。Bedrock AgentCore Gateway的引入通过在网关层级原生处理OAuth 2.0令牌交换,彻底改变了这一局面。
| 特性 | 传统Lambda拦截器 | Bedrock AgentCore Gateway(原生OBO) |
|---|---|---|
| 延迟开销 | 高(每次工具调用 > 150ms) | 低(网关原生处理 < 20ms) |
| 维护成本 | 高(自定义代码、密钥轮换) | 低(托管服务配置) |
| 安全风险 | 客户端密钥暴露风险更大 | 安全、集中化的凭据管理 |
| 集成复杂度 | 需要自定义中间件 | 原生工具定义映射 |
逐步配置指南
要配置AgentCore Gateway与Microsoft Entra ID和ServiceNow进行原生OBO令牌交换,请遵循此结构化的实现路径。如果您正在使用诸如 n1n.ai 等平台提供的工具在本地测试代理循环,请确保您的环境变量与生产配置相匹配。
第一步:在Microsoft Entra ID中注册应用
您需要在企业目录中建立信任关系:
- 代理应用程序(客户端): 注册一个代表您的AI代理的应用程序。为其授予代表用户请求令牌的API权限。
- ServiceNow目标API: 在您的ServiceNow集成上公开应用程序范围,或在Entra ID中注册ServiceNow企业应用程序,以接受由您的租户签发的令牌。
第二步:配置Bedrock AgentCore网关
导航至Amazon Bedrock控制台,选择AgentCore Gateways,并创建一个新的网关实例。您将配置上游身份验证和下游凭据提供商。
{
"gatewayName": "enterprise-servicenow-gateway",
"authentication": {
"type": "OAuth2",
"identityProviderConfig": {
"issuer": "https://login.microsoftonline.com/<tenant-id>/v2.0",
"clientId": "<agent-client-id>"
}
},
"tokenExchange": {
"grantType": "urn:ietf:params:oauth:grant-type:jwt-bearer",
"scope": "https://service-now.api.domain/.default",
"clientSecretArn": "arn:aws:secretsmanager:us-east-1:123456789012:secret:entra-client-secret"
}
}
第三步:定义ServiceNow工具架构
接下来,为您的代理将访问的ServiceNow REST API端点定义OpenAPI架构。网关利用此架构将代理意图参数直接映射到HTTP请求。
{
"openapi": "3.0.0",
"info": {
"title": "ServiceNow Incident API",
"version": "1.0.0"
},
"paths": {
"/api/now/table/incident": {
"post": {
"summary": "Create Incident",
"operationId": "createIncident",
"parameters": [
{
"name": "short_description",
"in": "query",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"201": {
"description": "Incident created successfully"
}
}
}
}
}
}
与您的应用程序代码集成
从后端应用程序调用代理时,请直接在授权标头中传递传入的用户JWT。Bedrock运行时将捕获此令牌,并在访问ServiceNow之前自动执行OBO交换。
import boto3
import requests
# 初始化bedrock客户端
client = boto3.client("bedrock-agent-runtime", region_name="us-east-1")
def invoke_agent_with_user_token(user_jwt, prompt_text):
response = client.invoke_agent(
agentId="YOUR_AGENT_ID",
agentAliasId="YOUR_ALIAS_ID",
sessionId="session-12345",
inputText=prompt_text,
sessionState={
"invocationType": "USER_CONTEXT",
"authToken": user_jwt
}
)
return response
企业部署的专业提示
- 令牌缓存: 在您的IdP中适当地配置令牌缓存窗口,以最大程度地减少高并发代理交互期间的延迟峰值。
- 范围最小化: 确保AgentCore Gateway请求的Entra ID范围严格符合ServiceNow操作所需的最小权限原则。
- 统一聚合: 对于在Bedrock之外测试多模型设置的开发人员,将您的开发管道与 n1n.ai 进行集成,可以确保跨不同模型提供商的统一API路由、速率限制和成本监控。
获取免费API密钥请访问 n1n.ai