本节的
from_veidentity(client_secret=...) 直接复用方式、A2A 1.0 AgentCard 和托管 API Key 解析属于未发布的 Preview,按以下源码版本核验;VeADK 1.1.13 不包含这些增量。需要这些能力时,可在独立虚拟环境中安装该版本API Key 认证
API Key 通过唯一字符串密钥验证请求方身份、授权访问 API 资源。本节的 VeFaaS API 网关部署使用 URL 的token 参数传递 API Key;其他服务的认证方式应按对应 API 文档配置。
API Key 仅适用于 A2A / MCP Server 部署模式,不建议在 VeADK Web 部署模式中使用;后者更推荐 OAuth2。
--auth-method=api-key 启用。此后用户访问应用时,API 网关会校验 token URL 参数中携带的 API Key。
OAuth2 单点登录
OAuth2 是一套开放的授权框架,通过令牌而非直接暴露账号密码,实现第三方应用对资源的有限访问;用户一次登录后即可免重复验证地访问多个关联应用。VeADK 提供两种接入方式:API 网关模式
适用于通过 VeFaaS 部署的 VeADK Web 应用,由 API 网关处理 OAuth2 流程。API 网关模式需要 4.0.0 及以上版本的 API 网关。
--auth-method=oauth2;VeADK 会自动创建 Identity 用户池与客户端。若要复用已有资源,部署时用 --user-pool-name 与 --client-name 指定。
部署后在 Agent Identity 中创建用户:
1
进入用户池
登录火山引擎控制台,进入 Agent Identity 服务,在左侧选择 身份认证 › 用户池管理,选择用户池。
2
新建用户
在用户池的 用户 标签页点击 新建用户,填写信息并确定。
Authorization 请求头取得用户的 JWT 令牌。
Starlette / FastAPI 中间件
适用于本地开发或自托管部署,通过 VeADK 提供的中间件在应用内处理 OAuth2,支持所有基于 Starlette 的框架(含 FastAPI)。推荐用OAuth2Config.from_veidentity() 自动配置 VeIdentity 用户池:
示例依赖 fastapi 和 uvicorn,先运行 pip install fastapi uvicorn 安装。每个应用只调用一次 setup_oauth2();后续片段是替代配置,不应依次追加到同一应用
准备已有用户池和 Web 客户端,预先登记 http://localhost:8000/oauth2/callback。设置 OAUTH2_USER_POOL_NAME、OAUTH2_CLIENT_NAME,并为运行进程提供有权读取这些资源的云凭据。示例仅用于本地 HTTP 调试;上线后使用 HTTPS 并恢复 cookie_secure=True
app.py
app.py,运行 uvicorn app:app --host 127.0.0.1 --port 8000。未登录时,访问 /api/profile 应返回 401;浏览器访问 /oauth2/login 完成登录后,再访问该接口应返回 authenticated: true
from_veidentity() 默认允许创建不存在的资源并登记回调,示例将这两项关闭。需要自动创建时应先确认资源创建权限与回调地址。Starlette 用法相同
复用已有资源时关闭自动创建:
client_uid 与 client_secret,跳过启动时的客户端查询:
OAuth2Config。以下替代配置片段适用于签发 JWT 访问令牌的提供商;先按提供商的 OpenID Connect 元数据设置各端点、签发者与公钥集环境变量,并将 OAUTH2_AUDIENCE 设为该 API 接受的令牌受众。不要把任意客户端 ID 当作受众
jwks_uri;缺少公钥集配置会导致 JWT 校验无法完成。提供商签发不透明访问令牌时,改用 use_introspection=True 并设置 introspection_url,按提供商要求提供内省客户端凭据
中间件会自动注册以下路由:
可配置跳过认证的路径:
exempt_paths=["/health", "/metrics"](精确匹配)、exempt_prefixes=["/public/", "/static/"](前缀匹配)。中间件按请求类型响应:浏览器请求重定向到登录页,API 请求返回 401。API 请求通过 Accept: application/json 请求头、路径前缀(默认 /api/)或 X-Requested-With: XMLHttpRequest 识别,可用 api_path_prefixes 自定义。
应用集成参数
setup_oauth2() 返回管理 OAuth2 流程的 OAuth2Handler,并注册认证路由与中间件
例如,在已创建
app 与 config 后,可用以下片段替换原 setup_oauth2() 调用。config.redirect_uri 和提供商登记的回调必须同步改为新的回调地址
VeIdentity 配置参数
OAuth2Config.from_veidentity() 参数如下。省略 session_timeout_seconds 时,会尝试使用客户端配置的刷新令牌有效期;读取不到时保留 OAuth2Config 默认值
OAuth2Config 参数
端点与授权请求
会话与 Cookie
访问令牌校验
存储与请求行为
从用户信息端点获取的信息仅保留适合写入浏览器会话 Cookie 的标准字段:
sub、email、email_verified、name、given_name、family_name、preferred_username、picture、locale、updated_at,以及通过 user_id_field 配置的用户标识字段。仅保留类型为字符串、整数、浮点数或布尔值的字段值,以避免会话 Cookie 超出浏览器大小限制。/oauth2/userinfo 端点返回的即为这些过滤后的字段。多进程共享 OAuth state
默认的InMemoryStateStore 仅适用于单进程。多实例应用需要所有实例共享同一 state 存储,并保证 state 只能使用一次
以下为替代 setup_oauth2() 调用的配置片段,复用前文的 app 与 config。先安装 redis 包,准备支持 GETDEL 的 Redis 6.2 及以上版本,并设置 REDIS_URL。应用使用独立键前缀,所有实例保持一致;生产连接与凭据按部署要求配置
create_state() 返回随机 state 并保存重定向地址与 PKCE 校验值;validate_and_consume_state() 原子读取并删除记录,失效时返回 None。自定义存储自行管理有效期、容量与连接生命周期,state_max_entries 不会自动限制 Redis 中的记录
OAuth2 JWT 认证
OAuth2 JWT 认证将 OAuth2 授权框架与 JWT 结合,用 JWT 承载授权令牌,适用于 A2A / MCP Server。 在脚手架创建智能体时选择 OAuth2,或为已有项目在部署时加上--auth-method=oauth2;VeADK 会自动创建 Identity 用户池,需要复用时用 --user-pool-name 指定。随后在 Agent Identity 的用户池中新建 M2M 类型客户端,用其凭据换取 JWT 令牌:
Authorization 请求头取得。
A2A 调用中的身份透传
在使用 AgentKit A2A registry 的调用链中,VeADK 可以把当前请求携带的身份凭证传递给下游智能体,使下游继续按原用户身份和信任关系执行授权。
对于声明 OAuth2 的下游智能体,VeADK 先使用透传的 Bearer JWT 发起请求。只有下游明确返回
401 Unauthorized 时,才会改用 OAuth2 M2M 令牌重试一次。其他状态码或调用错误不会触发 M2M 回退,避免把业务错误或服务故障误判为身份令牌失效。
托管 API Key 凭据鉴权
当下游 AgentCard 在capabilities.extensions 中声明了凭据提供方(包含 credentialProviderName 与 poolName),且 security / securitySchemes 未产生有效的认证头时,VeADK 会向身份服务查询该凭据提供方托管的 API Key,并按照返回的凭据元信息中指定的请求头名称与前缀构造认证头。此机制由 Agent Identity 统一托管 API Key,无需在 VeADK 侧手动配置。
VeADK 支持解析 A2A 1.0 AgentCard:当 AgentCard 未提供顶层
url 字段时,会从 supportedInterfaces 中按协议绑定类型和版本解析调用地址,优先选择 JSONRPC 绑定与 1.0 协议版本。技能沙箱中的身份透传
execute_skills 在调用技能沙箱时同样会将入站身份凭证转发给沙箱。VeADK 从凭证服务中读取凭证键为 inbound_auth 的入站凭证,并以 inbound_auth 请求头发送到沙箱的 A2A 端点,使沙箱中的工作流能够以原始用户身份执行。若当前请求未携带入站凭证,则不附加该请求头。详见代码沙箱中的技能沙箱执行部分。
会话与部署限制
cookie_signing_secret 用于签名浏览器会话,省略时回退到 client_secret;公开客户端应显式配置稳定的签名密钥。签名用于防篡改,不等于加密。多实例部署需共享签名密钥和 OAuth state 存储,且公网回调必须与客户端登记地址完全一致