{"_id":"@channingxiao/licence-sdk-node","name":"@channingxiao/licence-sdk-node","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.1":{"name":"@channingxiao/licence-sdk-node","version":"1.0.1","description":"授权验证 SDK - 用于验证应用授权状态","main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./react":{"types":"./dist/react.d.ts","import":"./dist/react.mjs","require":"./dist/react.js"}},"scripts":{"build":"tsup","dev":"tsup --watch","generate-keys":"node scripts/generate-keys.mjs","pack:tgz":"npm run build && npm pack","prepublishOnly":"npm run build"},"dependencies":{},"devDependencies":{"@types/node":"^22.0.0","@types/react":"^19.0.0","react":"^19.0.0","tsup":"^8.0.0","typescript":"^5.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0"},"peerDependenciesMeta":{"react":{"optional":true}},"keywords":["licence","license","authorization","rsa","signature","sha256"],"author":{"name":"channingxiao"},"license":"UNLICENSED","private":false,"_id":"@channingxiao/licence-sdk-node@1.0.1","gitHead":"85b10f5af06de6aec88e50b766624e38884f6f47","_nodeVersion":"20.19.5","_npmVersion":"10.8.2","dist":{"integrity":"sha512-/GK97zZl6Q//Gpq2M8WgqJbFP6nBWlQXxGamN3TbF8lGlyLdjK5ufQh47SygTtyuy0B8GPW+495JoZ1Aa0tjmw==","shasum":"b13e74993726b48ea53708274baadc43ffc78d4b","tarball":"https://registry.npmjs.org/@channingxiao/licence-sdk-node/-/licence-sdk-node-1.0.1.tgz","fileCount":10,"unpackedSize":52529,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFRw1+kMDtzDrJxK8eBGHG9Gb3pcYaHYeaANx1XmxHijAiBatiDR9YsfgX8ExzLelHtHGoc2QtYrlP3ikB3Ec/kFCQ=="}]},"_npmUser":{"name":"channingxiao","email":"chlxiao@163.com"},"directories":{},"maintainers":[{"name":"channingxiao","email":"chlxiao@163.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/licence-sdk-node_1.0.1_1766923020796_0.24147625398844186"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-28T11:57:00.681Z","1.0.1":"2025-12-28T11:57:00.950Z","modified":"2025-12-28T11:57:01.269Z"},"maintainers":[{"name":"channingxiao","email":"chlxiao@163.com"}],"description":"授权验证 SDK - 用于验证应用授权状态","keywords":["licence","license","authorization","rsa","signature","sha256"],"author":{"name":"channingxiao"},"license":"UNLICENSED","readme":"# Licence SDK\r\n\r\n授权验证 SDK，用于验证应用授权状态。\r\n\r\n## 安全设计\r\n\r\n此 SDK 使用 Ed25519 非对称加密进行签名验证：\r\n- **私钥**：仅存在于授权服务中，用于签名\r\n- **公钥**：硬编码在此 SDK 中，用于验证签名\r\n\r\n即使公钥被公开，也无法伪造有效的授权签名。\r\n\r\n## 安装\r\n\r\n### 从本地 .tgz 文件安装（推荐）\r\n\r\n```bash\r\n# 使用 npm\r\nnpm install /path/to/anthropic-licence-sdk-1.0.0.tgz\r\n\r\n# 使用 yarn\r\nyarn add /path/to/anthropic-licence-sdk-1.0.0.tgz\r\n\r\n# 使用相对路径\r\nnpm install ../packages/anthropic-licence-sdk-1.0.0.tgz\r\n```\r\n\r\n### 在 package.json 中引用\r\n\r\n```json\r\n{\r\n  \"dependencies\": {\r\n    \"@guokeyunqi/licence-sdk\": \"file:./packages/guokeyunqi-licence-sdk-1.0.0.tgz\"\r\n  }\r\n}\r\n```\r\n\r\n### 从 URL 安装（内网服务器）\r\n\r\n```bash\r\nnpm install http://internal-server/packages/guokeyunqi-licence-sdk-1.0.0.tgz\r\n```\r\n\r\n## 初始化\r\n\r\n### 1. 生成密钥对\r\n\r\n```bash\r\ncd licence-sdk\r\nnode scripts/generate-keys.mjs\r\n```\r\n\r\n将生成的公钥复制到 `src/publicKey.ts`。\r\n\r\n### 2. 配置授权服务\r\n\r\n将生成的私钥配置到 C++ 授权服务中。\r\n\r\n## 使用方法\r\n\r\n### 基础授权检查\r\n\r\n```typescript\r\nimport { checkLicence, isLicenced } from '@company/licence-sdk';\r\n\r\n// 检查授权\r\nconst result = await checkLicence(\r\n  process.env.LICENCE_KEY,\r\n  'http://localhost:18080'\r\n);\r\n\r\nconsole.log(result.valid ? '授权有效' : '授权无效');\r\n\r\n// 同步获取状态（需要先调用 checkLicence）\r\nif (isLicenced()) {\r\n  // 执行需要授权的操作\r\n}\r\n```\r\n\r\n### 获取机器码\r\n\r\n```typescript\r\nimport { getFingerprint, checkServiceHealth } from '@company/licence-sdk';\r\n\r\n// 检查授权服务是否可用\r\nconst isHealthy = await checkServiceHealth('http://localhost:18080');\r\nif (!isHealthy) {\r\n  console.error('授权服务不可用');\r\n  return;\r\n}\r\n\r\n// 获取机器码\r\nconst result = await getFingerprint('http://localhost:18080');\r\nif (result.success) {\r\n  console.log('机器码:', result.fingerprint);\r\n  // 用户可以复制此机器码申请授权\r\n} else {\r\n  console.error('获取失败:', result.error);\r\n}\r\n```\r\n\r\n### API 路由保护\r\n\r\n```typescript\r\n// app/api/devices/route.ts\r\nimport { withLicenceCheck } from '@company/licence-sdk';\r\n\r\nasync function handleGet(request: Request) {\r\n  // 业务逻辑\r\n}\r\n\r\nexport const GET = withLicenceCheck(handleGet);\r\n```\r\n\r\n### React 组件\r\n\r\n```tsx\r\n// app/layout.tsx\r\nimport { LicenceProvider } from '@company/licence-sdk/react';\r\n\r\nexport default function Layout({ children }) {\r\n  return (\r\n    <LicenceProvider\r\n      licenceKey={process.env.NEXT_PUBLIC_LICENCE_KEY}\r\n      serviceUrl=\"/api/licence/verify\"\r\n    >\r\n      {children}\r\n    </LicenceProvider>\r\n  );\r\n}\r\n\r\n// 在组件中使用\r\nimport { useLicence, LicenceGuard } from '@company/licence-sdk/react';\r\n\r\nfunction MyComponent() {\r\n  const { valid, loading } = useLicence();\r\n  \r\n  return (\r\n    <LicenceGuard fallbackUnauthorized={<div>需要授权</div>}>\r\n      <ProtectedContent />\r\n    </LicenceGuard>\r\n  );\r\n}\r\n```\r\n\r\n### 数据过滤\r\n\r\n```typescript\r\nimport { filterData, isFeatureEnabled } from '@company/licence-sdk';\r\n\r\n// 未授权时限制数据量\r\nconst devices = filterData(allDevices, 3);\r\n\r\n// 检查功能是否可用\r\nif (!isFeatureEnabled('smart-records')) {\r\n  return { error: '此功能需要授权' };\r\n}\r\n```\r\n\r\n## API 参考\r\n\r\n### 核心函数\r\n\r\n| 函数 | 说明 |\r\n|-----|------|\r\n| `checkLicence(key, url)` | 异步检查授权状态 |\r\n| `isLicenced()` | 同步获取缓存的授权状态 |\r\n| `clearLicenceCache()` | 清除授权缓存 |\r\n\r\n### 机器码/设备指纹\r\n\r\n| 函数 | 说明 |\r\n|-----|------|\r\n| `getFingerprint(url)` | 获取设备指纹码（机器码） |\r\n| `checkServiceHealth(url)` | 检查授权服务是否可用 |\r\n| `getServiceVersion(url)` | 获取授权服务版本 |\r\n\r\n### API 保护\r\n\r\n| 函数 | 说明 |\r\n|-----|------|\r\n| `withLicenceCheck(handler)` | API 路由授权装饰器 |\r\n| `wrapApiHandlers(handlers)` | 批量包装 API 处理函数 |\r\n\r\n### 数据过滤\r\n\r\n| 函数 | 说明 |\r\n|-----|------|\r\n| `filterData(data, limit)` | 未授权时限制数据量 |\r\n| `isFeatureEnabled(feature)` | 检查功能是否可用 |\r\n\r\n### React\r\n\r\n| 组件/Hook | 说明 |\r\n|-----|------|\r\n| `LicenceProvider` | 授权状态 Provider |\r\n| `useLicence()` | 获取授权状态 Hook |\r\n| `LicenceGuard` | 授权保护组件 |\r\n| `LicenceStatusBadge` | 状态指示器 |\r\n\r\n## 授权服务 API 格式\r\n\r\n授权服务需要返回以下格式的响应：\r\n\r\n```json\r\n{\r\n  \"code\": 200,\r\n  \"message\": \"Licence is valid\",\r\n  \"data\": {\r\n    \"status\": \"valid\",\r\n    \"valid\": true,\r\n    \"timestamp\": 1735344000,\r\n    \"signature\": \"base64_ed25519_signature...\"\r\n  }\r\n}\r\n```\r\n\r\n签名内容格式：`{licence}|{status}|{timestamp}`\r\n\r\n## 许可证\r\n\r\nUNLICENSED - 私有软件\r\n\r\n","readmeFilename":"README.md","_rev":"1-0d5eb4776277302c3102ca14b76a1407"}