百积木文档
开发指南Bundle 生命周期插件开发

首次握手与凭据轮换

一次性引导、双向数据库凭据、可恢复交付与在线轮换的协议。

本页是插件双向握手凭据的交付、轮换与撤销规范。公共 SDK 的 enrollment 模块提供类型。 会话协议由注册声明 protocols.credentials 选择,会话业务请求与响应不带 contractVersion;版本与选择边界见 权威规范。 管理员接入 create/status/revoke 保持独立管理合同 2.0.0,管理 DTO 的 contractVersion 保留;不包含 environmentId 或 endpointName。 Contract crate 只提供类型和校验;HTTP 调用、数据库存储、加密和轮换调度由插件自己的服务实现。 本页适用于直接承载协议的插件服务,也适用于 独立 Adapter Hosted Service。 采用 Adapter 时,将插件身份、一次性引导授权和加密密钥交付到 Adapter Environment;凭据由 Adapter 独立数据库保存与轮换,业务后端不复制握手状态或平台长期 Token。 插件身份独立于部署载体。平台只登记插件标识、工作区归属、授权回调地址和凭证状态,不保存 Hosted Service 或 Application Runtime 绑定。 CLI 接入步骤见插件注册与管理。

首次操作顺序与分层验收统一见首次接入流程与验收。本页描述程序实现协议,不能代替部署交付步骤。 服务启动后建立并持久化双向凭据;生命周期接口校验当前有效凭据后执行请求。

两个方向,各自独立

平台调用插件的 caller token 由插件生成;平台加密保存,插件长期保存验证哈希。 插件调用平台的 platform token 由平台生成;平台长期保存验证哈希,插件加密保存。 CLI 只签发一次性授权并将 Token 写入指定私密文件,凭据交付由部署所有者完成。 采用 Hosted Service 时,通过其独立配置管理命令写入 Secret 并显式绑定进程变量;仅保存 Secret 值不会自动注入进程。 握手完成后,由部署所有者清理本地 Token 文件、引导键及变量绑定,保留身份与加密密钥绑定。 数据库加密密钥通过部署 Secret 提供,不能和密文一起放在业务数据库,也不能复用用户登录凭据、业务服务 token 或引导 token。

每次发起请求读取当前有效凭据,不能将启动时的 token 一直保存在鉴权器或 HTTP 客户端中。 双向数据库中的代次由交付协议关联,两个数据库之间不存在原子事务。

交付顺序

  1. 插件先持久保存唯一 exchangeId、基准代次及本次生成的 caller token 密文,再发起交换。
  2. 用引导 token 或当前有效 platform token 请求 POST /bundle-plugin-manager/api/plugin-session/exchange, 提交 pluginId、exchangeId、expectedGeneration、executeUrl和 callerToken。
  3. 平台锁定插件身份并创建候选代次,返回 platformToken、generation、expiresAt、renewAfter、pendingUntil。 相同交换重试返回同一组凭据;相同授权不能被不同交换或不同 caller token 认领。
  4. 插件先将候选 platform token 加密落库,再用它调用 POST /bundle-plugin-manager/api/plugin-session/confirm, 提交 pluginId和 exchangeId。
  5. 平台在一个本地事务内确认代次并切换出站凭据,返回 previousValidUntil。插件随后推进本地当前代次, 删除临时 caller token 密文。平台删除为重复交付而暂存的 platform token 密文。

尚未确认的候选 token 只能用于确认交付,不能提前用于平台业务接口。确认操作可重试,确认响应丢失时 使用已经落库的新 token 再确认即可。多个副本必须通过数据库事务和唯一约束复用同一候选交换, 不能按响应到达顺序覆盖代次。

轮换、撤销与恢复

插件按平台返回的 renewAfter 调度下一次交换。初始部署策略为:引导和待确认交付各最长 30 分钟, 长期凭据 30 天,提前 7 天轮换,上一代最多重叠 5 分钟。期限来自平台版本化配置,插件不能自行扩大。 旧代在期限结束后立即拒绝;后台秘密清理不替代每次鉴权时的期限校验。

过期且未确认的轮换交付可用当前有效 platform token 调用 POST /bundle-plugin-manager/api/plugin-session/abandon,提交原 exchangeId。 只有平台确认它未生效并已超时后,插件才删除本地候选并建立下一次交换。 已经确认的交付不得丢弃,必须恢复确认结果。若当前凭据也已失效,则由管理员重新授权。

为即时观察平台撤销,插件先校验本地 caller token,再通过当前有效 platform token 调用 POST /bundle-plugin-manager/api/plugin-session/authorize-caller,提交 pluginId和 callerToken。 只有返回成功且 data 为 true 才接受本次受保护调用;不得缓存结果,平台不可达时失败关闭。 切换期间平台可能先于插件本地事务完成,此时使用已经持久接收的候选 platform token 验证对应 caller token。 撤销会终止待确认交付,旧 token 不能通过轮换重新激活身份。已经发出的请求无法追回。

数据库不可用、加密密钥错误、关联身份不符或凭据失效时,应明确拒绝受保护操作。 进程健康检查验证数据库连接和 listener;后台握手建立受管会话,接入状态单独记录并验证。

迁移与发布顺序

插件管理不调用 Hosted Service 核验接口。已有插件的握手、确认、轮换和 caller 授权继续使用会话协议 1.0.0。 管理接口升级为 2.0.0 后使用 CLI 0.98.0 或后继兼容版本;旧部署定位字段不再接受。 删除历史部署绑定不会清除已有凭证、代次或授权历史,不需要为了此变更重新授权。 接入时先准备插件数据库与 Secret,再交付一次性授权,完成握手并回读确认结果。

已经启用受管凭据后,不能只回滚到不理解该状态的旧镜像。恢复必须使用支持本协议的版本或执行明确的管理员重新授权。 文档不构成线上验收:必须完成真实握手、无引导变量重启、响应丢失恢复、在线轮换和撤销测试后才宣告上线。

本页内容