本文へ移動
Launch ドキュメントに戻る

Markdown をダウンロードGitHub の原文

事業者所有のライセンスアダプターのサンプル

この Python 3.10+ サンプルは、SQLite によるイベント/nonce の永続化と復旧ワーカーを備えた Launch の外部 HTTP ブリッジを実装します。ライセンスの生成、保護された機能の検証、ライセンスシステムの置き換えは行いません。

以下のフックを備えた Python モジュールを実装してください:

def apply_snapshot(snapshot):
    # Call your licensing system with snapshot["event_id"] as its durable
    # idempotency key. Apply desired_state and the absolute purchased dates.
    # Return only after confirming the original operation was applied.
    # Raise ValueError for a result requiring manual review.
    ...

def delivery(snapshot):
    # Read an existing result owned by this purchase; do not issue here.
    return {"type": "instructions", "value": "Your own delivery instructions", "expires_at": None}

バックエンドを設定する前に、... を実際の連携処理に置き換えてください。バックエンドモジュールが設定されていない場合、付属のフックは NotImplementedError を発生させ、イベントは手動レビューに入り、ライセンスが発行されたとは決して報告しません。サンプルのワーカーはクラッシュや結果が不明なエラーの後にフックを再試行することがあるため、ライセンスバックエンドは同じイベント ID を使用して重複排除/復旧を行う必要があります。

環境変数を使用してアダプターを設定し、キーをソース管理やシェル履歴に残さないようにしてください:

  • CUSTOM_LICENSING_KEY:Launch と一致する、32–128 ランダムバイトの標準 Base64 エンコード。
  • CUSTOM_LICENSING_KEY_ID:key-1、または設定したキー識別子。
  • CUSTOM_LICENSING_CONNECTION_REF:一致する接続参照。
  • CUSTOM_LICENSING_ENVIRONMENT:sandbox または live。
  • CUSTOM_LICENSING_DATABASE:チェックアウト外にある、書き込み可能な非公開 SQLite パス。再起動後も永続化してください。
  • CUSTOM_LICENSING_BACKEND:上記のフックを実装する、インポート可能なモジュール。
  • CUSTOM_LICENSING_PORT:ローカル待受ポート。デフォルトは 18883。

python server.py を実行します。ローカルの sandbox テストでは、Launch に http://127.0.0.1:18883 を設定し、ループバック HTTP の例外を明示的に有効にします。本番では HTTPS 終端、プロセス監視、保護されたデータベースバックアップ、バックエンド自身の SDK/ランタイム検証を使用します。バックエンドが実際にサポートする購入/配信タイプのみを公開し、それに応じて capabilities を調整してください。

バックエンドの問題を修正した後、python server.py --retry-event ORIGINAL_EVENT_UUID をローカルで実行すると、保存済みの同じペイロードが再びキューに入ります。Launch のライセンスタスクページでも元のイベントを再試行してください。応答を復旧するために ID を変更したり、時間を再度追加したりしてはいけません。

このサンプルは出発点であり、本番環境への適格性を保証するものではありません。ワーカーのリースは 60 秒です。フック呼び出しのタイムアウトをそれより短くするか、リースを更新してください。本番購入を受け付ける前に、監視、ローテーション手順、より厳格な業務/スキーマチェック、デプロイ環境の運用管理を追加してください。連携ガイドと OpenAPI がプロトコルを定義しています。Launch のステータス応答を保護されたコードの実行許可として使用してはいけません。