aps-agent/docs/adr/0012-identity-binding-and-c...

49 lines
4.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 落地时定