跳到正文
LICENTIVO / INTEGRATION

JavaScript 軟體授權整合:Node.js 與 Electron

安裝 Node.js SDK,啟用客戶金鑰並保護非同步匯出。在 Electron 主處理序保留授權用戶端,管理裝置身分與心跳。

Node.js 20+ / Electron更新日期

1. 準備產品與授權

先使用裝置綁定授權與一般匯出功能,確認授權流程正常後再增加功能次數計量。

裝置額度按目前啟用裝置計算,釋放後返還;一般授權離線仍占用,浮動授權租約到期後自動返還。

  1. 在控制台「產品」複製產品 ID,點擊同一產品的「簽章公鑰」,將每一組金鑰 ID、公鑰填入初始化程式碼,取代 YOUR_PRODUCT_ID、YOUR_KEY_ID 和 YOUR_PUBLIC_KEY。快速接入也可直接複製已填好的程式碼。無需設定檔;SDK 預設連線至 https://www.licentivo.com。
  2. 在「快速整合」建立或選擇產品,在策略中啟用名為 export 的功能,並準備測試授權。

2. 安裝 SDK

在自己的應用程式專案中執行下方安裝命令或加入建置依賴,安裝 SDK 0.11.6。套件管理器負責取得 SDK,無需下載解壓原始碼套件或設定本機原始碼路徑。

Terminal
npm install @licentivo/sdk@0.11.6

3. 保護一次實際匯出

將 SDK 初始化接到自己軟體的啟動或啟用入口,從啟用視窗讀取客戶授權碼,傳入產品 ID、信任公鑰並保持用戶端存活。將 RunFeature 放在實際業務入口,以自己的功能取代匯出範例函式。

Node.js 20+ / Electron · main.mjs
import {writeFile} from 'node:fs/promises';
import {Client} from '@licentivo/sdk'; // Installed package: import from '@licentivo/sdk'.

// BEGIN LICENTIVO PRODUCT
// Copy Product ID and all key ID/public key pairs from Console > Products > Signing public keys.
const PRODUCT_ID = 'YOUR_PRODUCT_ID';
const TRUSTED_KEYS = {'YOUR_KEY_ID': 'YOUR_PUBLIC_KEY'};
// END LICENTIVO PRODUCT

export async function exportReport(path) {
  // Replace this write with your existing, non-metered export operation.
  await writeFile(path, 'A report generated by the licensed application.\n', {mode: 0o600});
}

async function main() {
  // In Electron, create this in the main process, using customer activation input.
  const client = await Client.openProduct(
    PRODUCT_ID, TRUSTED_KEYS,
    process.env.LICENTIVO_LICENSE_KEY ?? '',
    error => console.error('Background verification:', error.message),
  );
  try {
    const feature = process.env.LICENTIVO_FEATURE ?? 'export';
    const path = process.env.LICENTIVO_OUTPUT ?? 'licensed-report.txt';
    const action = () => exportReport(path);
    if (process.env.LICENTIVO_METERED === '1') {
      await client.runMeteredFeature(feature, 1, process.env.LICENTIVO_OPERATION_ID ?? '', action);
    } else {
      await client.runFeature(feature, action);
    }
    console.log(`License OK: ${feature} is available\nExport completed: ${path}`);
  } finally {
    await client.close(); // In your application, close only when the app exits.
  }
}

main().catch(error => {console.error(error.message); process.exitCode = 2;});

4. 在應用程式結束時關閉用戶端

本命令列範例執行一次操作後結束。整合桌面應用程式時,在啟動時建立一個用戶端,在匯出按鈕或命令中呼叫功能回呼,直到應用程式結束才關閉用戶端。

首次啟用後,後續啟動可將 LICENTIVO_LICENSE_KEY 留空,在相同使用者及快取位置還原私有裝置憑證。憑證儲存在使用者應用程式資料目錄,不隨安裝套件散布。關閉用戶端會停止心跳並歸還浮動席位;一般結束不應取消裝置綁定。

只有策略允許、簽章授權仍有效時才能離線使用。授權過期或功能遭拒時持續阻止業務操作;功能次數計量需要連線。

Electron 中由主處理序持有 Client,透過明確的 IPC 介面提供需要保護的業務操作。等待 runFeature 與 close 完成,並讓用戶端涵蓋整個應用程式生命週期;非同步業務實際完成後才能回報成功。

5. 執行並核對結果

在控制台「產品」複製產品 ID,點擊同一產品的「簽章公鑰」,將每一組金鑰 ID、公鑰填入初始化程式碼,取代 YOUR_PRODUCT_ID、YOUR_KEY_ID 和 YOUR_PUBLIC_KEY。快速接入也可直接複製已填好的程式碼。無需設定檔;SDK 預設連線至 https://www.licentivo.com。

  1. 使用允許 export 的有效授權執行,確認產生 licensed-report.txt。
  2. 清空 LICENTIVO_LICENSE_KEY,以相同使用者再次執行,確認可還原已儲存的裝置憑證。
  3. 將 LICENTIVO_FEATURE 改為授權未提供的功能,並將 LICENTIVO_OUTPUT 改為新檔名。程式應提示拒絕,而且不產生新檔案。
  4. 僅在策略允許且簽章授權未到期時測試離線重新啟動。背景更新發生錯誤後,也不能略過失敗的功能檢查。
Windows · PowerShell
$env:LICENTIVO_LICENSE_KEY = 'YOUR_LICENSE_KEY'
node main.mjs
Linux / macOS · Bash
LICENTIVO_LICENSE_KEY=YOUR_LICENSE_KEY node main.mjs

常見整合問題

檢查產品 ID、每組金鑰 ID 和公鑰、客戶輸入的授權碼。公鑰屬於產品;客戶授權與本機憑證分別管理。開發測試授權碼及廠商管理 API Key 不隨客戶安裝包發送。

功能遭拒、裝置數已滿或授權過期:在控制台核對授權與策略,並向客戶顯示 SDK 錯誤。授權失敗時不能呼叫匯出函式。

一般功能介面只檢查權限;計次介面負責預留與結算已設定的用量。每項實際業務使用獨立且穩定的操作編號;中斷還原前先核對持久化業務結果。

找不到模組時,在 main.mjs 所在專案安裝 @licentivo/sdk。設定 proxy_url 時還須安裝與 Node.js 版本相符的選用 undici 套件。