Files
flvx/docs/superpowers/specs/2026-04-03-keygen-license-integration-design.md
T
sagit 49ab2915ee feat: commercial white-label support (#403)
* fix: increase updateTunnel timeout to 120s

Editing tunnel entry nodes triggers forward sync to all entry nodes.
If nodes are offline or many forwards exist, the sync can exceed
the default 30s timeout. Match the timeout used by other heavy
operations like batchDeleteTunnels.

* docs: add commercial white-label design spec

* docs: add commercial white-label implementation plan

* feat: add license activation endpoint and authorization check for commercial config keys

* feat: add frontend api and update site config state for license

* feat: conditionally hide flvx footer brand

* feat: ui settings for commercial white-label and license activation

* fix: add missing licenseActivateRequest and fix GetConfig in handler.go

* docs: add keygen.sh license integration design spec

* docs: add keygen.sh integration implementation plan

* feat: add machine fingerprint generation

* feat: add keygen.sh api client

* feat: integrate keygen into license activation endpoint

* feat: add periodic license validation job

* fix: remove accidentally leaked dash kernel test codes that caused compilation failures

* fix: correct keygen validation scope and binding logic

* feat: hardcode Keygen.sh account ID

* fix: relax strict validation matching after successful machine activation
2026-04-03 07:23:22 +00:00

4.9 KiB
Raw Blame History

FLVX 商业版 Keygen.sh 授权集成设计方案

1. 目标

使用 Keygen.sh 替换当前 FLVX 中基于 Mock 的商业版授权验证逻辑。通过接入 Keygen.sh,实现安全、可控的许可证分发、设备绑定(防止一码多用)、定期验证以及远程吊销功能,为 FLVX 的商业化白标功能提供生产级支持。

2. Keygen.sh 核心概念映射

  • Account (账户):您在 Keygen 注册的商户账号。
  • Product (产品):在 Keygen 中创建一个名为 FLVX Panel 的产品。
  • Policy (策略):定义授权规则。例如,创建一个 White-Label Policy,限制每个 License 只能绑定 1 个 Machine(即一个 FLVX 面板实例),并可配置有效期(如按年订阅或永久有效)。
  • License (许可证):发给客户的激活码(Key),格式可自定义(如 FLVX-XXXX-XXXX)。
  • Machine (机器/设备):运行 FLVX 的具体服务器或面板实例。为了防止一码多开,FLVX 激活时需要向 Keygen 注册一台 Machine。

3. 架构设计与集成流程

3.1 唯一设备标识 (Machine Fingerprint)

为了在 Keygen 中标识不同的 FLVX 面板,FLVX 后端需要生成并持久化一个唯一的机器指纹(Fingerprint)。

  • 生成时机:FLVX 首次启动或首次激活时,生成一个 UUID v4。
  • 存储:保存在数据库 vite_config 表中,键名为 machine_fingerprint。

3.2 激活流程 (License Activation)

当用户在前端输入激活码并点击“激活”时:

  1. FLVX 后端验证 Key:调用 Keygen API POST /v1/accounts/{account}/licenses/actions/validate-key,传入 key。
  2. 检查 License 状态:如果返回 valid: true,说明 License 合法且未过期。
  3. 激活 Machine (设备绑定):
    • 调用 Keygen API POST /v1/accounts/{account}/machines。
    • 关联刚才验证的 licenseId,并传入 FLVX 的 machine_fingerprint。
    • 异常处理:如果该 License 已绑定了其他 Machine(达到 Policy 上限),Keygen 会报错,FLVX 后端需返回“该授权码已在其他设备使用”。
  4. 持久化状态:激活成功后,在本地数据库保存 license_key、is_commercial: "true",以及从 Keygen 返回的额外信息(如过期时间 license_expiry)。

3.3 定期心跳与验证 (Periodic Validation)

为了防止用户激活后断网或通过修改数据库绕过,以及实现远程吊销:

  • 定时任务:FLVX 后端增加一个后台协程(如每天运行一次,或每 12 小时运行一次)。
  • 验证逻辑:调用 Keygen API 验证当前的 license_key 和 machine_fingerprint。
  • 吊销/过期处理:如果 Keygen 明确返回 License 已吊销(Suspended/Revoked/Banned)或已过期,或者当前 Machine 不再属于该 License,FLVX 后端需将 is_commercial 强制设为 "false",并清空本地缓存,恢复官方品牌展示。
  • 宽限期 (Grace Period):考虑到用户服务器可能偶尔网络不通,如果请求 Keygen 超时或失败,不应立刻吊销。可设置一个宽限期(如连续 3 天请求失败才降级)。

4. 后端 API 改造计划 (go-backend)

4.1 新增环境变量/配置

  • KEYGEN_ACCOUNT_ID: 您的 Keygen 账户 ID(打包时可硬编码,或作为全局环境变量)。
  • (可选)KEYGEN_PRODUCT_TOKEN 或仅使用 License Key 进行验证(取决于 Keygen 验证方式的选择,推荐直接使用 License Key 进行无状态验证)。

4.2 改造 /api/v1/license/activate

  • 引入 HTTP 客户端向 api.keygen.sh 发起请求。
  • 实现上述提到的 Validate Key 和 Activate Machine 两步走逻辑。
  • 返回具体的错误信息给前端(例如:“授权码不存在”、“授权码已过期”、“激活设备数达上限”)。

5. 前端改造计划 (vite-frontend)

前端在目前的 UI 基础上几乎不需要大改,只需配合后端的增强:

  1. 展示过期时间:如果后端返回了 license_expiry,可以在“商业版授权”卡片中展示“授权有效期至:YYYY-MM-DD”。
  2. 错误提示优化:透传后端返回的 Keygen 验证错误,给予用户明确的指引。
  3. 解绑/停用功能(可选):未来可增加“停用授权”按钮,调用后端接口在 Keygen 中删除 Machine 绑定,以便用户将 License 迁移到新的服务器。

6. 实施步骤建议

  1. 在 Keygen.sh 注册账号,创建 Product 和 Policy,生成测试用的 License Key。
  2. 在 FLVX 的 go-backend 中新建一个 pkg/keygen 或 internal/license 包,封装 Keygen API 的调用(Validate, Activate Machine)。
  3. 修改现有的 licenseActivate 接口,接入真正的验证逻辑。
  4. 添加定期验证的 Cron Job。
  5. 测试激活、吊销、过期、断网等各种场景。