1. 先别急着调模型:A2A 授权通过后,Windsurf 还缺一张模型侧通行证
你在 Casdoor 里把两个 Agent 的 A2A 授权配好,审计日志也看到agent.invoke通过了,结果 Windsurf 的 Agent 一发起模型请求就返回401 invalid api key,或者 Cascade 一直提示模型不可用。这个问题很常见:Casdoor 解决的是「Agent 之间怎么证明身份、能不能互相调用」,而 Windsurf Agent 真正消耗 Token 去调模型时,还需要模型侧凭据。两件事发生在不同链路上,配置字段也不一样。
本文按一个可复现的排障路径来写:先拿 Casdoor 的 A2A 授权记录,再把 Windsurf Agent 的模型供应商切到 TaoToken,Key 从 TaoToken 官网控制台获取,模型 Base URL 填https://taotoken.net/api。如果你现在还没有 Key,可以先到 TaoToken 官网看一眼模型与 Key 的入口:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=casdoor_a2a_windsurf_intro 。整篇会产出一张 A2A 授权记录表、一份 Windsurf Agent 配置与模型凭据填写对照表,以及 Claude Code、Codex、CC Switch 的字段区分配置,避免把ANTHROPIC_*错套到 Codex 上。
先明确边界:Casdoor 负责「你是谁、你能调用哪个 Agent、这次 A2A 调用有没有被授权」;TaoToken 负责「你调模型时用哪个 Key、消耗哪个账号的 Token、Base URL 指向哪里」。把这两层混在一起,就会出现授权明明成功、模型调用却 401 的情况。
2. Casdoor 侧怎么留下可复现的 A2A 授权记录
A2A 授权不是点一下「同意」就结束,生产环境里至少要能回答四个问题:哪个 Agent 发起的、代表哪个用户或组织、被授权访问哪个目标 Agent、授权范围和过期时间是什么。Casdoor 的可视化后台和审计能力正好适合做这件事,但你需要主动记录,不能只依赖浏览器里的登录态。
2.1 在 Casdoor 里准备 Agent 身份
建议不要把 Windsurf Agent 和人类用户混成同一个 Client。为每个需要参与 A2A 通信的 Agent 建独立应用或客户端,命名上带清楚环境,例如:
windsurf-dev-agent-01windsurf-prod-agent-researchcasdoor-mcp-gateway
然后在 Casdoor 中配置对应的组织、应用和权限策略。A2A 场景下,至少要把「调用方 Agent」和「被调用方 Agent」分开授权。不要给一个 Agent 开全局通配 scope,否则审计日志里只能看到「有人调用了」,无法定位是哪个 Agent 越权。
2.2 A2A 授权记录表应该记什么
下面这张表可以直接复制到你的项目文档里,每次联调后填一行。字段名可以根据你的 Casdoor 版本调整,但核心信息不要少:
| 字段 | 示例 | 说明 |
|---|---|---|
| 授权时间 | 2025-06-18T10:22:31+08:00 | 记录授权发生时间 |
| 调用方 Agent | windsurf-dev-agent-01 | Windsurf 侧发起 A2A 的 Agent |
| 目标 Agent | casdoor-research-agent | 被调用的 Agent 或 MCP 服务 |
| Casdoor Client ID | windsurf-dev-agent-01 | 用于换 Token 的客户端标识 |
| Scope | agent.invoke model.proxy | 最小授权范围,按实际能力拆开 |
| Audience / aud | casdoor-research-agent | 令牌预期接收方,防止串用 |
| Token 过期时间 | 2025-06-18T11:22:31+08:00 | 短期令牌优先 |
| Token 指纹 | sha256:前 12 位 | 只记指纹,不记完整 Token |
| 审计日志位置 | Casdoor > Logs > A2A | 方便后续排障 |
| 关联 TaoToken Key | key-xxxx(后四位) | 只记标识,不记完整 Key |
这张表的价值在于:当 Windsurf Agent 调模型失败时,你可以快速判断是 A2A 授权过期、scope 不够,还是模型侧 Key 没配。很多团队把 401 和 403 混着查,最后浪费几个小时。
2.3 用客户端凭证换 A2A Token 的本地验证
下面这段命令只用于你在本地或隔离环境验证 Casdoor 的 A2A 授权链路,不要直接在 Agent 代码里硬编码 secret。Casdoor 地址换成你自己的:
curl -X POST "https://your-casdoor.example.com/api/login/oauth/access_token" \ -H "Content-Type: application/json" \ -d '{ "grant_type": "client_credentials", "client_id": "windsurf-dev-agent-01", "client_secret": "CASDOOR_AGENT_SECRET", "scope": "agent.invoke model.proxy", "audience": "casdoor-research-agent" }'返回的 Token 不要写进博客、不要提交到 Git。你只需要记录它的指纹和过期时间,然后把 Token 放到 Windsurf 的 MCP 或 A2A 网关请求头里。注意:这里的 Token 解决的是 Agent 间调用鉴权,不是模型推理鉴权。Windsurf Agent 下一步去调模型时,仍然要带 TaoToken 的 API Key。
2.4 在 Casdoor 后台看 A2A 审计链路
授权完成后,回到 Casdoor 的日志或审计模块,确认能看到这次 A2A 调用的完整链路:谁发起的、什么时候发起的、目标是谁、结果成功还是失败。如果你们接了 OpenClaw 之类的遥测能力,可以把工具调用轨迹和 LLM 交互记录一起收进来。但不要误解:遥测和审计只解决「可见性」,不替代模型侧的 Key 配置。
3. TaoToken 侧拿 Key:Windsurf Agent 模型凭据填写对照
Casdoor 的 A2A 授权记录有了,接下来处理模型侧。Windsurf Agent 调模型消耗 Token 时,需要的是 TaoToken 的 API Key,而不是 Casdoor 的 Client Secret。Key 的创建入口在 TaoToken 控制台,具体路径可以从官网进:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=casdoor_a2a_windsurf_key 。创建 Key 后,模型 Base URL 统一填:
https://taotoken.net/api注意这个 Base URL 不加 UTM 参数,UTM 只用于官网跳转统计。Key 占位符用YOUR_API_KEY,不要把你真实 Key 写进配置文件后提交到仓库。
3.1 两层凭据不要混:Casdoor 授权 vs TaoToken 模型凭据
| 配置项 | Casdoor A2A 授权 | TaoToken 模型凭据 |
|---|---|---|
| 解决什么问题 | Agent 间身份与调用授权 | 调模型时的 Token 消耗与鉴权 |
| 核心字段 | Client ID、Client Secret、Scope、aud | API Key |
| 请求头示例 | Authorization: Bearer CASDOOR_A2A_TOKEN | Authorization: Bearer YOUR_API_KEY |
| Base URL | 你的 Casdoor 网关地址 | https://taotoken.net/api |
| 放置位置 | Windsurf MCP / A2A 网关配置 | Windsurf 模型供应商配置、环境变量 |
| 审计位置 | Casdoor 日志 | TaoToken 控制台调用记录 |
| 常见错误 | 403 scope 不足 | 401 invalid api key |
这张表是整篇最核心的对照。很多 Windsurf 用户把 Casdoor 的 Token 填到模型供应商的 API Key 里,结果模型侧当然不认。反过来,把 TaoToken 的 Key 填到 A2A 网关请求头里,Casdoor 也不会认。两边各管一段,才能跑通。
3.2 Windsurf Agent 侧推荐配置方式
Windsurf 不同版本的模型供应商 UI 会变,但核心只有三个字段:Provider、Base URL、API Key。以 OpenAI Compatible 或 Anthropic Compatible 入口为例,填写方式如下:
| Windsurf 字段 | 填写值 |
|---|---|
| Provider / 供应商 | OpenAI Compatible 或 Anthropic Compatible |
| Base URL / API Base | https://taotoken.net/api |
| API Key | YOUR_API_KEY |
| Model / 模型名 | 填你 TaoToken 账号下可用的模型名 |
| 额外请求头 | 若客户端要求,使用Authorization: Bearer YOUR_API_KEY |
如果 Windsurf 当前版本只允许在设置里填 Key、不允许改 Base URL,可以用环境变量或本地配置注入。下面这组环境变量适合在本地 shell、Docker Compose 或 CI 隔离环境里使用:
export OPENAI_API_BASE="https://taotoken.net/api" export OPENAI_API_KEY="YOUR_API_KEY" export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_AUTH_TOKEN="YOUR_API_KEY"再次强调:ANTHROPIC_*只给 Anthropic 兼容客户端或 Claude Code 用,不要把它套到 Codex 的配置里。Codex 有自己的config.toml和 provider 字段,混用会导致请求发到错误端点。
3.3 Windsurf MCP 配置只放 A2A Token,不要放模型 Key
如果你的 Windsurf Agent 通过 Casdoor 的 MCP Gateway 调用工具,MCP 配置里放的是 Casdoor 的 A2A Token;模型推理 Key 放在模型供应商设置里。示例:
{ "mcpServers": { "casdoor-a2a-gateway": { "url": "https://your-casdoor.example.com/mcp", "headers": { "Authorization": "Bearer CASDOOR_A2A_TOKEN" } } } }这份配置解决的是「Windsurf 能不能调用 Casdoor 后面的 Agent 工具」;它不解决「Windsurf 调模型时用哪个 Key」。两个配置都配对,Agent 才能完整跑通:先通过 Casdoor 拿到 A2A 授权,再用 TaoToken Key 消耗模型 Token。
4. Windsurf 多 Agent 配置示例:Claude Code、Codex、CC Switch 分开写
多 Agent 开发环境里,经常同时出现 Windsurf、Claude Code、Codex、CC Switch。它们都连 TaoToken 时,Base URL 一样,但字段名完全不同。下面给出可复制示例,按工具区分。
4.1 Claude Code:settings.json / ANTHROPIC_*
Claude Code 使用settings.json或环境变量。示例:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "claude-sonnet-4-20250514" } }如果你更习惯 shell 环境变量:
export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_AUTH_TOKEN="YOUR_API_KEY" export ANTHROPIC_MODEL="claude-sonnet-4-20250514"Claude Code 的文档入口可以在文末 CTA 里找到。注意ANTHROPIC_AUTH_TOKEN和ANTHROPIC_API_KEY在不同版本里可能不同,按你当前版本的官方字段来。核心是 Base URL 指向https://taotoken.net/api,Key 用YOUR_API_KEY。
4.2 Codex:config.toml,不要套 ANTHROPIC_*
Codex 使用config.toml,字段和 Claude Code 完全不同。示例:
model = "gpt-5" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "responses"然后设置环境变量:
export TAOTOKEN_API_KEY="YOUR_API_KEY"Codex 这里不要写ANTHROPIC_BASE_URL,也不要写ANTHROPIC_AUTH_TOKEN。它读取的是env_key指定的变量,再由 provider 配置决定请求发到哪里。多工具并存时,最容易出错的就是把 Claude Code 的字段复制到 Codex。
4.3 CC Switch 三件套:供应商名、Base URL、API Key
CC Switch 类工具通常用于在多个供应商之间切换。不管 UI 怎么变,核心是三件套:
| 三件套 | 填写值 |
|---|---|
| 供应商名称 | TaoToken |
| Base URL | https://taotoken.net/api |
| API Key | YOUR_API_KEY |
如果 CC Switch 还要求填模型名、协议类型,按你实际使用的模型和客户端协议选择。不要把 Casdoor 的 Client Secret 填进来,也不要把 TaoToken Key 填到 A2A 网关配置里。切换供应商后,建议先在本地发一条最小模型请求,确认返回正常,再让 Windsurf Agent 接管。
4.4 Windsurf 与其它工具的配置对照
| 工具 | 配置文件 / 入口 | Base URL 字段 | Key 字段 |
|---|---|---|---|
| Windsurf | 模型供应商设置 / 环境变量 | https://taotoken.net/api | YOUR_API_KEY |
| Claude Code | settings.json | ANTHROPIC_BASE_URL | ANTHROPIC_AUTH_TOKEN |
| Codex | config.toml | [model_providers.taotoken].base_url | env_key = "TAOTOKEN_API_KEY" |
| CC Switch | 供应商配置 | Base URL | API Key |
| Casdoor MCP | mcp_config.json | Casdoor 网关地址 | CASDOOR_A2A_TOKEN |
这张表建议直接放进你们团队的接入文档。多 Agent 项目里,配置错误比代码错误更常见,而错误往往来自字段混用。
5. 联调排障:401、403、404、429 分别查什么
A2A 授权和模型 Key 都配好之后,仍然可能遇到报错。按下面顺序排查,效率最高。
| 错误码 | 常见原因 | 优先检查 |
|---|---|---|
| 401 invalid api key | 模型侧 Key 不对,或 Base URL 写错 | Windsurf 模型供应商是否填YOUR_API_KEY,Base URL 是否为https://taotoken.net/api |
| 403 forbidden | A2A scope 不足,aud 不匹配,Agent 未授权 | Casdoor 授权记录里的 scope、aud、目标 Agent |
| 404 model not found | 模型名错误,或 Base URL 多拼了路径 | 不要手动拼/v1,按客户端要求填完整 Base URL |
| 429 rate limit | TaoToken 侧额度、并发或频率限制 | TaoToken 控制台用量与调用记录 |
| 连接超时 | 网络策略、代理、DNS、TLS | 本地先 curl 测试https://taotoken.net/api可达性 |
| MCP 工具调用失败 | Casdoor A2A Token 过期或网关地址错 | 重新走 A2A 授权,检查mcp_config.json |
一个典型排障流程是:
- 在本地用
curl确认 TaoToken Base URL 和 Key 能通。 - 在 Casdoor 日志里确认 A2A 授权记录存在且未过期。
- 检查 Windsurf 模型供应商配置,确认 Key 不是 Casdoor 的 Token。
- 检查 MCP 配置,确认 Authorization 头是 Casdoor A2A Token。
- 如果仍失败,把 Windsurf 日志、Casdoor 审计记录、TaoToken 调用记录按时间对齐。
不要一上来就怀疑模型能力。多数情况下,问题在凭据放错层。
6. 生产安全边界:A2A 授权不是万能,模型 Key 不要进 Agent 代码
Casdoor 把身份和授权集中治理,确实能减少重复登录和权限散落,但它不是一键安全万能药。A2A 授权只解决 Agent 间通信的授权问题,业务侧的越权校验、资源级权限、数据脱敏仍然要你自己做。TaoToken 的 API Key 也一样,它代表模型消耗凭据,泄露后别人可以消耗你的额度。
生产环境建议:
- Casdoor 侧:按 Agent、环境、目标服务拆 Client,scope 最小化,短期 Token 优先,开启审计日志。
- TaoToken 侧:Key 放密钥管理或环境变量,不要硬编码进 Windsurf Agent 代码,不要提交到 Git。
- 轮换策略:A2A Token 和 TaoToken Key 都要有轮换周期,过期后主动失效旧凭据。
- 日志边界:记录 Token 指纹,不记录完整 Token;记录 Key 后四位,不记录完整 Key。
- Agent 边界:不要让 Windsurf Agent 直连生产库,也不要把数据库连接串塞进 MCP 工具。SQL、迁移、修复命令由你在本地或隔离环境执行。
- 权限边界:Casdoor 负责身份,业务系统仍要校验「这个用户/Agent 能不能操作这条记录」。
- 高可用:身份系统和模型网关都属于关键链路,备份、告警、容量规划不能按普通后台服务对待。
这些动作做完,你得到的不是「绝对安全」,而是一条可审计、可回滚、可定位问题的链路。对多 Agent 开发来说,这比省几行登录代码重要得多。
7. 文末 CTA:从模型对话到 Coding Plan,再到创建 Key
如果你已经按上面的步骤完成了 Casdoor A2A 授权,下一步就是把模型侧 Key 配到 Windsurf 里,并跑通一条最小调用链。推荐路径如下:
先到模型对话页面验证 TaoToken 模型可用性:
https://taotoken.net/models/detail/chat?utm_source=taotoken_aicg_blog_end&utm_content=casdoor_a2a_windsurf_chat如果你的 Windsurf Agent 需要长时间编码、频繁消耗 Token,可以看 Coding Plan:
https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=casdoor_a2a_windsurf_plan创建或管理 API Key:
https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=casdoor_a2a_windsurf_keysClaude Code 用户可以直接对照 Anthropic 兼容配置文档:
https://taotoken.net/doc/ClaudeCodeAnthropic?utm_source=taotoken_aicg_blog_end&utm_content=casdoor_a2a_windsurf_claudecodeTaoToken 官网入口(含 UTM):
https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=casdoor_a2a_windsurf_cta
最后再把关键配置收拢一遍:Casdoor 侧留好 A2A 授权记录,Windsurf 的 MCP 配置里放 Casdoor A2A Token;模型侧去 TaoToken 创建 Key,Windsurf 模型供应商 Base URL 填https://taotoken.net/api,Key 填YOUR_API_KEY。Claude Code 用settings.json/ANTHROPIC_*,Codex 用config.toml,CC Switch 记好三件套。两层凭据各归其位,Windsurf Agent 才能既安全通过 A2A 授权,又稳定消耗模型 Token。