Files
license-manager-sdk-python/docs/demand.md
T
2026-02-27 14:29:48 +08:00

83 lines
5.1 KiB
Markdown
Raw 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.
# License Manager Go SDK 需求
## 背景
- 当前客户端 demo 直接对接服务端,集成复杂且不利于复用。
- 多个需要授权的产品希望以库的形式快速接入授权能力。
- 需要一个接口简洁、易于扩展、对调用方入侵极低的 Go SDK。
## 目标
1. 封装授权激活、许可证校验、心跳续期等流程,减少业务方重复开发。
2. 提供清晰的配置与生命周期管理,支持 CLI、服务和嵌入式场景。
3. 兼容已有 License Manager 服务端接口,未来接口升级时对调用方透明。
4. 支持在线 / 离线两种工作模式,满足联网和隔离环境的授权需求。
## SDK 架构
| 模块 | 职责 |
|------|------|
| `license.Client` | SDK 入口,负责生命周期管理。 |
| `config` | 统一的配置结构体,支持代码、环境变量、配置文件三种来源。 |
| `hardware` | 硬件指纹采集,默认实现可被自定义扩展。 |
| `activation` | 激活接口封装、授权码加载、许可证缓存。 |
| `validator` | 对许可证内容、有效期、功能限制进行校验。 |
| `heartbeat` | 心跳轮询、动态间隔调整、失败退避策略。 |
| `storage` | 许可证加解密与本地持久化,支持自定义存储后端。 |
| `logger` | 统一日志接口,默认输出到标准输出,可注入业务日志实现。 |
### 硬件指纹采集策略
1. **标准组合指纹(默认)**:采集首个物理 MAC、CPU 型号、主机 ID,组合字符串后做哈希。
2. **可插拔字段选择**:调用方可通过配置决定纳入哪些硬件字段(如磁盘序列号、主板序列号等),SDK 保证字段顺序与哈希算法一致。
3. **自定义采集器**:提供 `hardware.Provider` 接口,允许业务方完全自定义指纹生成逻辑(适配虚拟化、容器等环境)。
4. **匿名化/脱敏模式**:支持在上报前对字段进行额外哈希或加盐,满足隐私/合规要求。
5. **实时采集策略**:每次需要校验时即时采集,避免任何形式的本地缓存,以消除被复制或伪造的风险;若采集失败需有清晰的回退与错误提示。
## 核心功能需求
1. **初始化**
- 必填配置:服务端地址(离线模式可选)、产品标识、版本号、授权码来源或许可证文件路径、服务端 RSA 公钥(可通过路径或内容提供)。
- 可选配置:心跳间隔、超时、日志级别、硬件指纹采集策略、自定义 HTTP 客户端。
2. **许可证加载与激活**
- **在线模式**:启动优先读取本地许可证;不存在或失效时自动激活,激活请求包含硬件指纹、产品信息、授权码,支持附加自定义字段。激活成功后自动校验并落盘,加解密沿用 AES-GCM;需使用配置中提供的 RSA 公钥验证服务端签名。
- **离线模式**:仅校验本地许可证文件合法性(签名/有效期/硬件绑定),不访问网络;当本地许可证缺失或过期时返回明确错误,由业务方决定更新方式。需通过配置显式提供许可证文件路径(默认 `license_code/license.lic` 可覆盖)及 RSA 公钥拷贝,保证可独立校验签名。
3. **许可证校验**
- 校验内容:签名/加密、有效期、硬件绑定、功能/限制字段。
- 提供同步 API(`Validate()`)供业务方在关键操作前主动检查。
- 提供只读访问接口(如 `client.CurrentLicense()`),可在业务运行时获取最新许可证的功能限制、配额等字段,便于执行业务级限制判断;当许可证更新时需即时刷新缓存并触发回调。
4. **心跳服务**
- 仅在在线模式启用:成功激活后自动启动,默认间隔 300s,可从服务器动态调整。
- 支持暂停/恢复接口,网络异常时指数退避并记录原因。
- 服务器返回新的许可证时自动替换并回调通知。
- 离线模式不启动心跳,SDK 需暴露显式 API 让业务层触发本地校验。
5. **事件与回调**
- 需支持 `OnLicenseUpdated`, `OnHeartbeatError`, `OnActivationRequired` 等回调。
- 回调在独立 goroutine 执行,避免阻塞主流程。
6. **错误处理**
- 统一错误类型,区分可重试与不可重试场景。
- 提供错误码枚举,便于业务层按类型处理。
7. **线程安全**
- SDK 所有公开方法需并发安全,核心状态(许可证、心跳)内部加锁。
8. **可测试性**
- 对 HTTP、时间、硬件指纹、存储等外部依赖提供接口,方便 Mock。
## 使用方式
```go
cfg := license.Config{
Server: "https://license.example.com",
Product: "edge-gateway",
Version: "2.3.1",
AuthCode: license.FromFile("license_code/authorization_code.txt"),
PublicKey: license.FromFile("license_code/rsa_public_key.pem"),
}
client, err := license.NewClient(cfg)
defer client.Close()
if err != nil { /* ... */ }
if err := client.Validate(context.Background()); err != nil {
// 业务自定义处理
}
```
## 交付物
- SDK 源码与 go.mod。
- `README`:安装、Quick Start、常见问题。
- 示例程序:最小化控制台示例 + 与现有 client-demo 等价的高级示例。