先把这几个对象分清,后面看 API 会快很多。
| 对象 | 含义 |
|---|---|
Product | 一个可授权的软件产品,拥有授权码前缀与发布源。 |
Plan | 授权的规则模板:模型、设备上限、宽限期、续验间隔与权益。 |
License | 发给一个客户的实例,绑定套餐、有效期与状态。 |
Activation | 某台设备使用某份授权的记录,占用一个设备名额。 |
Device identifier | 客户端计算并哈希后的机器标识,用于绑定激活。 |
Token | 服务端用 Ed25519 签名的离线凭证,内含 claims。 |
exp | token 的下次联网续验时间,不是授权到期。 |
vun | 授权本身的到期时间(买断可为空)。 |
ftr | 权益集合:布尔、数值与配额。客户端据此解锁功能。 |
Seat | 团队成员占用的名额;超限时最后加入者暂停。 |
Webhook | 支付、激活、吊销等事件的通知,带 HMAC 签名。 |
授权状态
trialing · active · expired · suspended · revoked
状态变化会反映在下一次 verify 或新签发的 token 中。离线期间无法感知吊销,最长延迟到一个 token 的 exp。
为什么 exp 和 vun 分开
exp 控制「多久必须联网一次」,vun 控制「授权买到什么时候」。把两者分开,可以在不缩短授权期限的前提下控制离线窗口,也可以在续费后立即签发更长的 vun 而不影响客户端节奏。
权益的三种形态
- boolean:功能开关,例如
publish: true。 - numeric:容量上限,例如导出次数或项目数。
- quota:随时间滚动的原子配额,由服务端扣减。
客户端的判断顺序 验签 → 检查 did 与设备指纹 → 检查 exp → 读取 ftr 解锁功能。不要只判断「有没有 token」。