1. 製品とライセンスを準備する
デスクトップアプリ、CLI、信頼できるバックエンドでは、REST 通信、端末認証情報、署名付きライセンスの処理を SDK に任せます。まず端末固定ライセンスと回数を消費しないエクスポート機能で動作を確認し、その後で月ごとの利用回数制限を追加します。
デバイス枠は現在のアクティベーション数で計算し、解除すると返却されます。通常ライセンスはオフラインでも枠を使用し、フローティングライセンスはリース満了時にも自動返却されます。
- [コンソール] > [製品] から製品 ID をコピーします。その製品の署名公開鍵を開き、すべてのキー ID/公開鍵のペアを初期化コードに貼り付けて、YOUR_PRODUCT_ID、YOUR_KEY_ID、および YOUR_PUBLIC_KEY を置き換えます。迅速な統合により、これらのパブリック コード定数を生成できます。製品構成ファイルは必要ありません。 SDK のデフォルトは https://www.licentivo.com. です
- Go 1.26 以降をインストールします。コンソールで、クイック統合を開き、製品を作成します。
- 製品の認可ポリシーでエクスポートという名前の機能を有効にします。テストライセンスを作成または選択します。
2. SDK をプロジェクトにインストールします
アプリのプロジェクトで以下のコマンドを実行するか、ビルド依存関係を追加して SDK 0.11.6 を導入します。パッケージマネージャーが SDK を取得するため、ソース ZIP の取得、手動展開、ローカルソースパスの指定は不要です。
go get github.com/spf86/licentivo-sdk@v0.11.63. 1 つの操作を保護する
SDK スタートアップをアプリケーションのスタートアップ ハンドラーまたはアクティベーション ハンドラーに移動します。アクティベーション フォームからカスタマー キーを読み取り、自分の製品 ID と信頼できるキーを渡し、シャットダウンするまでクライアントを存続させます。実際のビジネス エントリ ポイントに RunFeature を置きます。レポート ライターを独自の操作に置き換えます。
// One protected operation. Keep the client alive for the lifetime of your app.
package main
import (
"context"
"fmt"
licentivo "github.com/spf86/licentivo-sdk"
"os"
)
// BEGIN LICENTIVO PRODUCT
// Copy Product ID and all key ID/public key pairs from Console > Products > Signing public keys.
const productID = "YOUR_PRODUCT_ID"
var trustedKeys = map[string]string{"YOUR_KEY_ID": "YOUR_PUBLIC_KEY"}
// END LICENTIVO PRODUCT
func setting(name, fallback string) string {
if value := os.Getenv(name); value != "" {
return value
}
return fallback
}
// Call this at the business entry point, including keyboard/menu/CLI actions.
func exportReport(path string) error {
// Replace this write with your existing, non-metered export operation.
return os.WriteFile(path, []byte("A report generated by the licensed application.\n"), 0600)
}
func run() error {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// In a GUI, obtain key from the activation input. Later starts use an empty key.
client, err := licentivo.OpenProduct(ctx, productID, trustedKeys, os.Getenv("LICENTIVO_LICENSE_KEY"), func(err error) {
fmt.Fprintln(os.Stderr, "Background verification:", err)
})
if err != nil {
return err
}
defer client.Close() // Floating seats return; node-locked registration stays.
feature := setting("LICENTIVO_FEATURE", "export")
path := setting("LICENTIVO_OUTPUT", "licensed-report.txt")
action := func() error { return exportReport(path) }
if os.Getenv("LICENTIVO_METERED") == "1" {
err = client.RunMeteredFeature(ctx, feature, 1, os.Getenv("LICENTIVO_OPERATION_ID"), action)
} else {
err = client.RunFeature(feature, action)
}
if err != nil {
return err
}
fmt.Printf("License OK: %s is available\nExport completed: %s\n", feature, path)
return nil
}
func main() {
if err := run(); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(2)
}
}
4. アプリケーションの存続期間中、1 つのクライアントを維持する
実際のアプリケーションでは、起動時にクライアントを開き、RunFeature をエクスポート ボタンまたはコマンド ハンドラー内に配置します。シャットダウンするまでクライアントを存続させます。 Close はバックグラウンド作業を停止します。通常のノードロック登録が保持されます。
SDK は、アクティブ化後にマシンにバインドされた認証情報を保存します。後で開始する場合は、空のキーを渡し、同じユーザー アカウントとキャッシュの場所からそれを復元できます。アクティベーション ID を保存したり、HTTP ハートビートを自分で送信したりする必要はありません。
有効なノードロックされたオフライン リースは、SDK がバックグラウンドでオンライン更新されている間、ただちに復元できます。フローティング ポリシーまたはオンライン専用ポリシーには、サーバーの正常な応答が必要です。ログに記録されたバックグラウンド エラーを、失敗した機能チェックをバイパスする許可として決して扱わないでください。
5. 許可された操作と拒否された操作を確認する
- テスト キーを使用して 1 回実行し、レポートが存在することを確認します。
- LICENTIVO_LICENSE_KEY を削除し、同じユーザーで再度実行すると、保存された認証情報が復元されるはずです。
- エクスポートをライセンスに含まれていない機能に変更します。操作はレポートを書き込まずにエラーを返す必要があります。
- ポリシーで許可されており、署名されたリースがまだ有効である場合にのみ、オフライン再起動を確認してください。
よくある統合の問題
製品 ID、すべてのキー ID/公開鍵のペア、および顧客のライセンス入力を確認します。公開検証キーは製品に属します。顧客のライセンスと保存されたデバイスの認証情報は別のものです。開発テスト キーやベンダー管理 API キーを配布しないでください。
拒否された機能の場合は、機能名とライセンス ポリシーを確認する必要があります。 RunFeature は、残りの使用量ではなく、権利をチェックします。カウンタには RunMeteredFeature を使用します。
デバイスの制限、ライセンスの期限切れ、または明示的なサーバー拒否がある場合は、顧客またはベンダーが承認を解決する必要があります。可能な場合は、エラーとリクエスト ID を表示します。アプリケーションにはベンダー管理キーを決して含めないでください。