绑定授权与隔离
Skills 平台的安全基石是按授权绑定:每一个用户授权(consent grant)把「一个 Agent + 一个已授权用户 + 一项能力」绑成专属、不可交叉的三元关系。这种设计天然隔离了不同 Agent、不同用户的数据和权限,无需复杂的中央权限管理系统。 核心特点:- 天然隔离:每个 consent grant 的用户数据只对其绑定的 Agent 可见,跨 Agent 访问被永久拦截
- 无权限膨胀:不存在 Admin、Super User 等特殊角色,权限明确且固定,按能力(scope)限定
- 审计友好:每个授权关系清晰易追踪,便于日志审计和合规检查
双层认证
Skills 平台采用 API Key + 用户授权(consent grant) 的双层认证机制:- API Key — 标识 Agent 身份(连接层),由 Agent 应用方保管
- 用户授权(consent grant) — 标识一个已授权的外卖用户,一个 consent grant 对应一个用户、默认 90 天有效,通过绑定流程(SMS 验证码 / H5)获得
每个用户必须本人授权一次。 平台不提供 Admin 静默绑定 —— 不存在任何后台凭据可以替用户跳过授权(旧版ADMIN_SECRET/ 受信绑定已移除)。用户只能通过request_user_bind(SMS 默认 / H5)发起、再由本人verify_user_bind完成授权。
API Key(Agent 识别)
- 前缀:
clw_开头,后接随机字符,例如clw_a1b2c3d4... - 存储:服务端只存哈希、不保留明文,每次请求按哈希比对
- 颁发:在 Portal 创建 Agent 时生成,仅显示一次,遗失需重新生成
- 使用:在连接层 HTTP Header 中作为
Authorization: Bearer {API_KEY}传入,标识调用方 Agent
用户授权 consent grant(用户识别)
- 前缀:
cg_开头 - 一对一:一个 consent grant 对应一个用户(绑「Agent + 用户 + 能力」三元关系)
- 有效期:默认 90 天;到期或轮换后需用户重新绑定
- 来源:用户通过绑定流程(SMS 验证码 / H5)本人授权后获得;
verify_user_bind成功返回consent_grant_id、scopes、expires_at(ISO 8601) - 存储:明文仅本次返回一次,落库仅存哈希,请妥善保存
- 传递:作为每个 MCP 工具的
consent_grant_id参数传入(不放进 body,也不走请求头) - 失效:到达
expires_at过期,或被revoke_user_bind撤销后即时失效,需重新绑定获取新的
数据加密
Skills 平台对所有敏感数据进行分层加密 / 哈希,确保即使数据库泄露也无法直接还原关键信息:- 用户身份
- 电话号码
- 凭据哈希
用户 ID 加密
- 算法:AES-256-GCM
- 密钥:由服务端安全生成和管理
- 场景:用户 ID 在数据库中以密文存储
- 解密权限:仅绑定的 Agent 可解密其对应的用户数据
Agent-User 隔离
Skills 平台在数据访问层强制执行严格的隔离策略:- 每个授权类请求都携带 API Key 和
consent_grant_id - 服务端验证 API Key,解析出
agent_id - 服务端验证
consent_grant_id,定位已授权用户与其授权能力 - 数据库查询条件:
WHERE agent_id = ? AND user_id = ? - 任何跨越这两个条件的查询都会被拒绝(授权属于其它能力 / 服务商返回
CONSENT_GRANT_WRONG_CAP,能力未开通返回CAP_NOT_BOUND)
用户授权生命周期
关键节点:认证失败处理
认证 / 授权失败统一返回{"error": {"code", "message"}} 结构,并附相应的 HTTP 状态码:
401 Unauthorized
凭证缺失或无效
- 缺少 API Key(
AUTH_REQUIRED) - API Key 无效或已禁用(
AUTH_INVALID) - 缺少 consent_grant_id(
CONSENT_GRANT_REQUIRED) - consent_grant_id 无效或已过期(
CONSENT_GRANT_INVALID/CONSENT_GRANT_EXPIRED)
403 Forbidden
无权限访问
- 授权属于其它能力 / 服务商(
CONSENT_GRANT_WRONG_CAP) - 当前 Agent 未开通该能力(
CAP_NOT_BOUND)
429 Too Many Requests
速率限制
- 在限制时间内请求过多(
RATE_LIMITED) - 每个 Agent 独立限流(下单 10 次/分钟,其他 60 次/分钟)
统一错误格式
{"error": {"code", "message"}}- 所有认证 / 授权 / 业务错误同构
- 完整错误码见 错误处理
安全最佳实践
- Agent 应用端
- 服务端
- 绑定流程
- 保管 API Key:存储在安全的环境变量或密钥管理系统中,不要提交到版本控制
- 保管 consent_grant_id:安全存储用户授权凭证(明文仅返回一次),涉及用户敏感数据
- HTTPS only:所有与 Skills API 的通信必须使用 HTTPS
- 轮换与撤销:在 Portal 按需轮换 / 禁用 API Key(立即失效);consent grant 重授权即轮换,并可随时
revoke_user_bind撤销 - 错误处理:捕获 401/403 错误,提示用户重新认证或重新绑定

