4.1 KiB
4.1 KiB
ADR-0012:业务系统账号绑定与凭据获取
- 状态:已接受
- 日期:2026-09-29
- 决策人:技术负责人
- 相关:任务表 A5.4 / A5.7;架构设计 4.1、4.3、6;实施设计 2.4、5;ADR-0004(桌面端授权)、ADR-0008(库归属)
背景
A4.1 已经落地「平台用户 → 各系统账号」的绑定表和策略(未绑定默认拒绝,一个系统停用不影响另一个),A4.3 也把凭据做成密文存储加一次性执行句柄。但有一件事当时刻意留空:这条绑定里的登录态是怎么拿到的。
A5 要接真实 APS,这个问题必须先答:如果答案错了,后面每个业务系统都要各写一套登录和续期逻辑,凭据会散落各处,「不同系统登录态互相独立」也守不住。
选项
| 选项 | 做法 | 代价 | 不选的理由 |
|---|---|---|---|
| A 业务系统提供标准授权登录(OAuth2 / OIDC 授权码) | 平台发起跳转 → 用户在业务系统登录 → 回调带 code → 平台换 token | 需要业务系统支持标准协议;要处理回调与续期 | 选定为主 |
| B 平台收账号密码,一次性换 token | 老系统没有标准登录时,平台弹窗收账号密码,调它的登录接口换 token,密码用完即弃 | 部分系统只能这么接;要明确「密码不落盘」的实现约束 | 作为过渡方案保留 |
| C 长期 API Key / 服务账号 | 管理员在平台配置 key,挂在租户或实例上 | 没有按人的登录态,出问题查不到具体人 | 仅用于无人值守的系统级集成 |
| D 平台存业务系统密码,每次调用现登 | 密码入库,调用前先登录 | 实现最直白 | 密码落盘等于把业务系统的身份长期托管给平台;失效判断、改密、审计全部变复杂 |
结论
选 A 为主、B 为过渡、C 限系统级。共同规则如下:
| 项 | 结论 |
|---|---|
| 声明位置 | Provider manifest 增加 auth 声明(oauth / password-exchange / apikey),平台按声明走对应流程,平台侧接口不变 |
| 平台职责 | 发起绑定、接收回调、兑换凭据、加密存储、续期、失效判定、日志脱敏;不实现业务系统的登录页面 |
| 存什么 | 只存 token / refresh token(或 API Key)的密文,绝不存密码;密码只在一次兑换调用里经过内存 |
| 何时取用 | 只在一次 execution 内,经 A4.3 的一次性句柄;工具参数、事件、日志、模型上下文里都没有 |
| 失效行为 | 该系统的调用立即被拒(policy.identity_disabled 或凭据不可用),界面提示重新绑定;其他系统不受影响 |
| 解绑 | 删除绑定与密文;审计与执行历史保留(ADR-0008 的「执行历史不删」) |
| 桌面端 | 走系统浏览器 + 本地 loopback 回调,不在内嵌 webview 里收集密码(与 ADR-0004 的授权码 + 设备绑定同一思路) |
| 浏览器端 | 复用平台登录态发起绑定;业务系统 token 不下发给客户端(协议第 3 节) |
影响
- 对代码:
server/provider-sdk增加auth声明与exchange();server/core/identity增加绑定流程(发起 / 完成 / 解绑);server/entry/http增加绑定端点;客户端设置页增加「账号绑定」区块 - 对任务:A5.4 收敛为实例路由(哪个租户或工厂连哪个 APS 实例);新增 A5.7 账号绑定与登录态 承担本 ADR 的落地
- 对文档:架构设计第 4.1、6 节补绑定机制;实施设计 2.4 与第 5 节补绑定步骤;协议第 4 节在实现时加端点,并遵循「四处同步」规则
- 不这么做的后果:每个业务系统各自实现登录与续期,凭据散落在 Provider 内部,「凭据不出域」与「登录态互不影响」两条都会被绕过
遗留
- APS 最终用哪种方式(它能不能提供标准授权登录):由 B5 的契约化接口层定,这一条不阻塞平台侧实现
- 一个用户在同一个系统里绑多个账号(多工厂账号):首版一人一系统一条绑定,等有真实需求再放开
- token 续期的失败重试与提醒策略:A5.7 落地时定