本仓库包含两套服务器逻辑(同一代码仓内维护):
src/vendor相关路由:作为“总控服务器”(Vendor Control Plane)。- 其余
src/app + src/services主体:作为“开发者使用的 EXE 所连接的业务服务器”(Auth/API Plane)。
下面按“调用关系 + 数据流”梳理。
┌────────────────────────────┐
│ 总控服务器(vendor routes) │
│ - /vendor/check │
│ - /vendor/activate │
│ - /admin/vendor/* │
└──────────────┬─────────────┘
│ HMAC 签名校验 + nonce/ts 防重放
│
▼
┌─────────────────────────────────────────────────────┐
│ 开发者业务服务器(main/app/services) │
│ 启动时调用 VendorClient::CheckOrExit │
│ -> POST /vendor/check │
│ 若失败则退出,若成功才启动 8080 API │
└──────────────┬──────────────────────────────────────┘
│
▼
开发者工具/EXE 调用业务 API(/login /card/activate /license/check 等)
关键点:业务服务器依赖总控服务器“放行”后才启动,这构成了上游授权门禁。
- 在启动 HTTP 服务前,先读取
vendorUrl/vendorKey/vendorSecret/machine。 - 调用
VendorClient::CheckOrExit(...)。 - 仅当总控校验成功,才继续初始化
DbPool / Services / Router / HttpServer并监听0.0.0.0:8080。
这意味着:
- 总控不可用或校验失败时,业务服务器不会对外提供 API。
- 总控是业务服务实例的“运行许可证中心”。
VendorClient 会向总控发起 POST /vendor/check,字段包含:
vendor_keymachine_codets(Unix 秒)nonce(随机)sign(HMAC-SHA256)
签名载荷格式:
METHOD + "\n" + PATH + "\n" + canonical_fields
其中 canonical 是按 key 排序拼接(不含 sign)。
总控主路由在 SetupVendorRoutes(...) 注册,核心分为三层职责:
-
实例授权校验
POST /vendor/check- 对业务服务器启动授权进行验签、时钟窗口校验、nonce 防重放、机器码绑定、过期检查。
-
续期/开通能力
POST /vendor/activate- 使用
vendor_card对vendor_license增加时长(续期)。
-
总控后台管理
/admin/vendor/card/*:创建/禁用/备注/列表/admin/vendor/license/*:总控 license 列表与封禁/admin/vendor/log/list:查看总控侧审计日志
总控对 POST /vendor/check 的典型顺序是:
- 基础字段合法性检查。
ts在允许窗口内(默认 ±60 秒)。- DB 事务读取
vendor_license(含vendor_secret)。 - 用该
vendor_secret验证sign。 - 验签通过后插入
vendor_nonce(防重放)。 - 检查状态(是否封禁)、是否过期、机器码绑定/一致性。
- 写
vendor_log审计并返回结果。
这条链路保证了:签名、时效、防重放、设备绑定同时生效。
业务接口由 Router::bind(...) 注册,主要是:
- 会话认证:
POST /login - 卡密激活:
POST /card/activate - 授权检查:
POST /license/check - 管理接口:
/admin/card/*、/admin/user/*、/admin/log/list
除 login 之外,多数敏感 POST 接口先经过 RequireSign(...),即 SignService::verify(...) 进行签名验真。
EXE/客户端
└─ POST /login
└─ SessionService 校验账号密码并生成 token
EXE/客户端
└─ POST /card/activate (token + machine_code + card_key + sign)
└─ CardService 执行卡密激活/机器绑定
EXE/客户端
└─ POST /license/check (token + machine_code + sign)
└─ LicenseService: token -> user -> status/machine/expire_time
└─ 返回 valid / reason / expire_time
- 总控(
vendor):控制“服务器是否有资格运行”,管理开发者 license 与续期卡,偏平台治理。 - 业务(其余模块):服务最终 EXE/客户端登录与授权校验,偏业务访问控制。
可理解为:
- 总控管“服”(server instance / developer server)。
- 业务管“人和端”(end user / machine / token / card)。
- 先启动总控(确保
/vendor/check可达)。 - 启动业务服务器,确认日志打印
Vendor OK后再监听8080。 - 再做 EXE 侧
login -> activate -> license/check调用链测试。 - 校验异常场景:
- 修改签名(应 401)
- 重放 nonce(应失败)
- 改机器码(应 machine_mismatch)
- 总控 license 过期或禁用(业务启动应失败)