diff --git a/README.md b/README.md index 068eece..7ce651b 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,20 @@ # Kintone License Server -一个 Node.js TypeScript 服务端程序,用于验证客户端的许可证,通过 RSA 签名生成 JWT。 +> 公网url: https://kintone.alicorns.co.jp + +基于 Node.js 的 kintone license 服务端,用于验证 kintone plugin 的 license。 + +目前支持: +- [kintone-vue-template](https://git.alicorns.co.jp/kintone-plugins/kintone-vue-template) ## 功能 - 提供 `POST /api/license/check` 接口,根据请求 body 中的 `domain`、`pluginId`、`pluginKey` 参数: - - 如果许可证不存在,创建 30 天试用许可证(到期时间为最后一天的 23:59:59)。 - - 如果存在,加载现有许可证。 - - 使用对应的插件 RSA 私钥生成 JWT,返回给客户端。 -- JWT payload 结构符合客户端要求的 LicenseInfo 接口。 -- 支持试用和付费许可证:基于数据库 `purchase_date` 是否有值判断 `isPaid`,付费许可证 `expiredTime = -1`。 + 1. 如果许可证不存在,创建试用许可证(时长基于 DB 配置,到期时间为最后一天的 23:59:59)。 + 2. 如果存在,加载现有许可证。 + 3. 使用对应的插件 RSA 私钥生成 JWT,返回给客户端。 + +> 对于用户付费,目前需要新增 `customers` 记录,并且手动修改数据库的 `licenses.purchase_date`、`licenses.customer_fk` ## 运行步骤 @@ -78,33 +83,14 @@ } ``` -## 项目结构 - -- `src/server.ts`:主服务器代码,包含 Express 应用、路由和数据库连接。 -- `init-db.sql`:数据库初始化脚本,创建 plugins、customers、licenses 三张表。 -- `private/kintone-vue-template/rsa_private.pem`:示例 RSA 私钥(已导入数据库)。 - ## 数据库结构 - **plugins**:插件信息(id, plugin_id, plugin_name, private_key, deleted)。多插件支持,每个插件有唯一私钥。 -- **customers**:客户信息(id, name, email, phone, comment)。暂未使用。 +- **customers**:客户信息(id, name, email, phone, comment)。 - **licenses**:许可证记录(id, domain, plugin_id, expired_time, purchase_date, plugin_fk, customer_fk, message)。 - - 外键 `plugin_fk` 关联插件,`customer_fk` 关联客户(暂未实施)。 + - 外键 `plugin_fk` 关联插件,`customer_fk` 关联客户。 许可逻辑: - 请求 (domain, pluginId) 组合唯一标识许可证。 -- 试用:`purchase_date = NULL`,`isPaid = false`,`expiredTime` = 30 天后时间戳。 -- 付费:`purchase_date` 被外部系统设置,`isPaid = true`,`expiredTime = -1`。 - -## 认证和安全性 - -- 使用 RSA-256 签名 JWT,私钥存储在 `plugins` 表中,按 `pluginKey` 区分。 -- 默认插入 "default-plugin" 插件,使用现有 RSA 私钥。 -- 数据库连接硬编码凭据(生产环境使用环境变量,如 .env 文件)。 - -## 注意事项 - -- 当前实现试用许可证,30 天过期时间硬编码。 -- 付费购买由其他系统更新 `purchase_date`,本服务仅校验。 -- PostgreSQL 需要预先配置和运行。 -- 代码使用 TypeScript 严格模式,确保类型安全。 +- 试用:`purchase_date = NULL`,`isPaid = false`,`expiredTime` +- 付费:`purchase_date` 被外部系统设置,`expiredTime = -1`。