craft_license 0.1.0 copy "craft_license: ^0.1.0" to clipboard
craft_license: ^0.1.0 copied to clipboard

Dart client for CraftLicense activation codes, device-bound buyout licenses, online renewal and offline Ed25519 certificate verification.

craft_license #

面向 Dart / Flutter 的 CraftLicense 买断授权 SDK。只实现客户端能力,不包含管理权限、服务端私钥、售卖流程或 Flutter UI。

支持激活码激活、设备额度查询、在线续签、候选公钥查询,以及固定可信公钥的 Ed25519 离线验签。包不依赖 dart:io,可用于移动端、桌面和 Web;真实硬件标识、凭证安全存储和授权 UI 由宿主负责。

接入 #

包尚未正式发布,当前通过 path 引用:

dependencies:
  craft_license:
    path: ../craft-license/client/packages/craft_license
import 'package:craft_license/craft_license.dart';

final CraftLicenseClient client = CraftLicenseClient(
  baseUrl: Uri.parse('https://license.example.com'), // 替换为真实入口。
  appId: '你的公开 AppID',
);
final LicenseDevice device = LicenseDevice(
  deviceId: '由宿主提供的稳定设备标识',
  platform: 'windows',
  name: '用户的电脑',
  clientVersion: '1.0.0',
);
final LicenseGrant grant = await client.activate(
  activationCode: '用户输入的激活码',
  device: device,
);
// 安全保存 grant.deviceToken 与 grant.certificate,不写入日志。
final LicenseStatus status = await client.status(deviceToken: grant.deviceToken!);
final LicenseGrant renewed = await client.renew(deviceToken: grant.deviceToken!);
// renew 不发新设备令牌,继续使用原令牌。
client.close();

默认只接受 HTTPS。仅本机开发可明确设置 allowLocalHttp: true,且 URL 必须是 localhost、127.0.0.1 或 ::1。支持配置 URL 路径前缀,但服务端和代理也必须支持对应路径,不能靠 SDK 单方面改变部署路由。

离线验签 #

final LicenseCertificateVerifier verifier = LicenseCertificateVerifier(
  trustedKeys: <LicenseVerificationKey>[
    LicenseVerificationKey.fromJwk(可信且预先固定的Jwk),
  ],
);
final VerifiedLicenseCertificate verified = await verifier.verify(
  certificate: grant.certificate,
  appId: client.appId,
  device: device,
);

只接受 EdDSA / Ed25519,校验可信 kid、签名、issuer、版本、应用、设备摘要、签发和到期时间、权益期限。verificationKeys() 只是获取候选公钥,不自动信任响应;正式应用应内置信任锚或使用已验证的更新渠道。

离线验证不能即时感知后台撤销、解绑或禁用;按照 nextCheckAt 在线复核,并按产品策略处理断网宽限。SDK 不启动计时器、不自动重试激活、不采集硬件、不写磁盘;本机时钟回拨与客户端篡改防护仍需宿主处理。不得把服务器签名、交付或管理密钥放进 App。

错误与生命周期 #

捕获 CraftLicenseException 的 code、statusCode 和 requestId。toString() 不打印请求正文、令牌或凭证。典型业务码包括 DEVICE_LIMIT_REACHED、LICENSE_DISABLED、DEVICE_BLOCKED,网络与协议错误包括 NETWORK_ERROR、REQUEST_TIMEOUT、INVALID_RESPONSE。

可注入 http.Client,用于测试或宿主网络策略;注入的客户端不会被 SDK 的 close() 关闭。默认创建的客户端由 SDK 负责关闭。

验证与发布 #

dart pub get
dart analyze
dart test
dart pub publish --dry-run

真实服务示例为 example/craft_license_example.dart。通过环境变量提供服务地址、AppID、激活码、稳定设备标识以及明确固定的公开 JWK 文件;示例只输出成功状态,不打印秘密。

本 SDK 使用 GPL-3.0(仅第 3 版),完整文本见 LICENSE。这一选择仅适用于此 Dart 包,不替其他项目或服务端变更许可证。发布前核对包名、账号和 dry-run 文件清单;包不携带 .env、管理员凭据或项目 .fx 数据。

2026-10-02 验证:12 项 HTTP/签名安全测试通过,已对本机真实服务完成激活、在线复核、续签与固定公钥离线验签。许可证已确认并补齐,公开发布状态以 pub.dev 返回结果为准。

0
likes
140
points
335
downloads

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

Dart client for CraftLicense activation codes, device-bound buyout licenses, online renewal and offline Ed25519 certificate verification.

Topics

#licensing #activation #ed25519

License

GPL-3.0 (license)

Dependencies

cryptography, http

More

Packages that depend on craft_license