pangu-user-platform/docs/05-模块技术方案/开放API-学生列表授权-需求设计方案.md

114 lines
5.9 KiB
Markdown
Raw Permalink Normal View History

# 开放API-学生列表授权 需求设计方案
> 作者pangu
> 创建时间2026-02-04
> 评审状态:待评审
---
## 一、背景与目标
### 1.1 背景
盘古用户认证中心已具备「应用管理」能力可创建第三方应用、分配应用编码appCode与密钥appSecret并在管理后台为应用勾选「接口授权」。当前缺少**对外暴露的开放 API** 及**基于应用身份的签名鉴权与接口授权校验**,外部系统无法在未登录用户的前提下,以应用身份安全调用已授权接口。
### 1.2 目标
- **需求侧**:支持外部系统以「应用身份」调用指定已授权接口(首期以**学生列表查询**为真实场景),不依赖用户登录 Token。
- **安全侧**:请求必须携带应用编码、时间戳、签名,服务端校验签名并校验该应用是否已授权访问该接口,未授权或签名错误一律拒绝。
- **可评审**:提供完整需求说明与技术方案,便于评审与后续扩展更多开放接口。
---
## 二、范围与边界
### 2.1 本期范围
| 序号 | 内容 | 说明 |
|------|------|------|
| 1 | 开放 API 机制 | 统一路径前缀 `/open/api/**`请求头鉴权X-App-Id、X-Timestamp、X-Sign |
| 2 | 学生列表查询 | 提供 GET `/open/api/student/list`,与现有业务逻辑一致,仅鉴权方式不同 |
| 3 | 应用管理侧 | 新增/编辑应用时保存「接口授权」到 pg_app_api查询应用详情时回显已选接口 |
| 4 | 接口字典 | pg_api_dict 中至少包含「学生列表」开放接口配置,供授权勾选与校验使用 |
### 2.2 边界(本期不做)
- 仅实现「学生列表」一个开放接口作为示例;其他业务接口(如学校、会员等)后续按同机制扩展。
- 不涉及 OAuth2/第三方登录;仅做「应用级」签名鉴权与接口授权。
---
## 三、用户角色与使用场景
### 3.1 角色
| 角色 | 说明 |
|------|------|
| 运营/管理员 | 在应用管理中创建应用、为应用勾选「学生列表」等接口授权 |
| 外部系统 | 使用 appCode + appSecret 对请求签名,调用 GET `/open/api/student/list` 获取学生列表(分页、筛选与现有一致) |
### 3.2 典型场景
1. **配置授权**
管理员在「应用管理」中新增应用「XX 学情系统」,保存后获得 appCode如 YY000001、appSecret32 位)。在编辑该应用时勾选「学生列表」接口授权并保存。
2. **外部调用**
XX 学情系统在服务端使用 appCode、appSecret 生成签名,请求 GET `/open/api/student/list?pageNum=1&pageSize=10`,并携带请求头 X-App-Id、X-Timestamp、X-Sign。平台校验通过且该应用已授权「学生列表」后返回分页数据。
3. **未授权/签名错误**
若未勾选「学生列表」或签名错误,返回 401/403 及明确错误信息,不返回业务数据。
---
## 四、功能需求
### 4.1 开放 API 鉴权与授权
- **FR-1** 请求必须携带请求头:`X-App-Id`(应用编码)、`X-Timestamp`(毫秒时间戳)、`X-Sign`(签名)。
- **FR-2** 时间戳与服务器时间差超过 5 分钟视为过期,拒绝请求。
- **FR-3** 根据 X-App-Id 查询应用信息;应用不存在或已停用则拒绝。
- **FR-4** 签名算法请求参数query+body 按参数名 ASCII 排序)拼接为 `key1=value1&key2=value2&...&appSecret=应用密钥`,再对该字符串做 MD5结果转大写与 X-Sign 比对;不一致则拒绝。
- **FR-5** 请求 URI 对应的「开放接口」必须在当前应用的授权列表中(以 pg_api_dict.api_path 与 pg_app_api 关联为准),否则拒绝访问。
### 4.2 学生列表开放接口
- **FR-6** 提供 GET `/open/api/student/list`,支持与现有学生列表一致的查询参数(如 studentName、studentNo、schoolId 等及分页参数pageNum、pageSize
- **FR-7** 响应格式与现有管理端学生列表一致TableDataInforows、total 等),便于对接方使用。
### 4.3 应用管理侧
- **FR-8** 新增/编辑应用时,请求体可携带接口授权标识(如 apiCodes接口编码列表保存时同步更新 pg_app_api先删该应用原有授权再按 apiCodes 插入)。
- **FR-9** 查询应用详情(含列表展示)时,返回该应用已授权的接口信息(如 apiCodes 或等效),供前端勾选回显。
### 4.4 接口字典
- **FR-10** pg_api_dict 中至少有一条「学生列表」开放接口记录api_path 为 `/open/api/student/list`api_method 为 GET供应用管理勾选与鉴权校验使用。
---
## 五、非功能需求
- **NFR-1** 鉴权失败时返回 HTTP 状态码与 JSON 错误信息(如 401 签名错误、403 无权限、400 参数缺失/过期)。
- **NFR-2** 授权关系变更后,建议在较短时间内生效(可为实时或短 TTL 缓存,技术方案中约定)。
- **NFR-3** 文档与示例:提供开放 API 调用说明及学生列表调用示例(含签名算法与示例请求),便于对接方自测与联调。
---
## 六、验收标准
1. 在应用管理中为某应用勾选「学生列表」并保存后,该应用使用正确签名调用 GET `/open/api/student/list` 可返回学生列表数据。
2. 未勾选「学生列表」的应用调用同一接口,返回 403 无权限。
3. 错误签名或过期时间戳,返回 401 或 400且不返回业务数据。
4. 应用管理新增/编辑时接口授权勾选可保存并回显;列表/详情中可看到已授权接口信息。
---
## 七、附录:术语
| 术语 | 说明 |
|------|------|
| appCode | 应用编码,如 YY000001唯一标识一个应用 |
| appSecret | 应用密钥32 位,用于参与签名计算,需保密 |
| 接口授权 | 应用与 pg_api_dict 中某条 API 的关联关系,存储在 pg_app_api |
| 开放 API | 以 `/open/api/**` 为前缀、使用应用签名鉴权的接口,无需用户登录 |