# Launch と Licentivo を使用したアプリ連携

このガイドは Licentivo プロバイダーに適用されます。Licentivo を使用せず事業者所有のライセンスシステムを接続するには、[カスタムライセンス API と連携フロー](/ja/launch-documents/external-licensing/)を使用し、製品／環境に `custom_http` を選択して、そのシステムのランタイム SDK を引き続き使用します。

これらのローカル未公開の変更はアカウント ID 交換を使用します。移行とサーバー側セッション失効については[責務と購入同期の契約](/ja/launch-documents/account-purchase-boundary/)を参照してください。この変更によってパッケージバージョンは公開または更新されていません。

Launch は事業者アカウント、注文、価格、更新／アップグレードの見積もり、返金、絶対的な購入日付を管理します。Licentivo はライセンス、ポリシー、デバイス枠、認可セッション、署名済み権限、ランタイム判断を管理します。Launch ログインの成功や同期済み購入は保護された作業を実行する許可ではありません。

管理画面の連携ページで直接接続呼び出しと固定された公開製品キーを取得します。9 言語すべてのラッパーに公式 SDK が含まれます。事業者管理キーと決済キーはサーバーに保持します。公開製品設定には顧客認証情報、デバイス ID、キャッシュパス、ID アサーションは含まれません。

## アカウント交換

```mermaid
sequenceDiagram
    participant App as Application
    participant Launch as Launch server
    participant SDK as Official Licentivo SDK
    participant Lic as Licentivo server
    App->>Launch: Account login
    Launch-->>App: Account session
    App->>Launch: POST /software/products/{id}/identity
    Launch-->>App: Short-lived signed identity assertion
    App->>SDK: In-memory identity + connection + environment
    SDK->>Lic: POST /launch/exchange
    Lic-->>SDK: Restricted device credential + signed permission + logout ticket
    App->>SDK: RunFeature around every protected action
```

ラッパーは `POST /api/v1/software/products/{id}/identity` を `{"environment":"sandbox"}` または `live` で要求します。返される ID アサーションは最大 120 秒間有効で、登録済み発行者、対象者、実際のログインセッション、製品、環境、購入参照に紐付いています。機能の許可、デバイス枠、オフラインポリシーは含みません。

公式 SDK はこれらの値をメモリ内で受け取ります：

```json
{
  "product_id": "LICENTIVO_PRODUCT_UUID",
  "trusted_keys": {"SIGNING_KEY_ID": "PINNED_PUBLIC_KEY"},
  "launch_connection_id": "LICENTIVO_LAUNCH_CONNECTION_UUID",
  "environment": "sandbox",
  "identity_token": "SHORT_LIVED_ASSERTION_FROM_LAUNCH",
  "license_key": ""
}
```

このランタイム設定を公開ファイルに書き込んだり、アサーションをアカウント記録に永続化したりしてはいけません。Launch v2 の記憶済み記録はアカウントセッションと公開ルートコンテキストのみを保存します。旧顧客 `/credential` エンドポイントは HTTP 410 を返します。

## ライフサイクルとストレージ

- `Login`：アカウントを認証し、新しいアサーションを要求して公式 SDK を起動します。
- `Restore`：記憶されたアカウントをオンラインで確認し、新しいアサーションを要求して公式 SDK を起動します。Launch の障害によってオフライン許可が選択されることはありません。
- `RunFeature`：保護されたすべての実行を公式 SDK に委譲します。拒否されたコールバックは決して実行してはいけません。
- `Close` / `Dispose` / `Drop`：バックグラウンド処理を停止し、明示的に記憶したログインとノード紐付けを保持します。
- `Logout`：公式 SDK の統一ログアウトを呼び出し、その後 Launch アカウント記録を消去してアカウントセッションを終了します。
- `ReleaseDevice`：明示的ログアウトの互換エイリアス。リモート失効が保留中であることを正確に報告します。

デバイス認証情報とリースファイルを削除するのは公式 SDK のみです。そのキャッシュディレクトリや `.logout.json` を削除してはいけません。このジャーナルはネットワークリクエスト失敗後に必要な制限付き解放チケットを保持します。対応するキャッシュが再初期化されると SDK が保留チケットを再開します。Launch 自体のアカウントストレージと SDK ストレージは別々の所有者が管理します。

オフライン起動が必要なアプリは公式 SDK の文書化された復元フローを使用します。署名済み許可、製品／環境コンテキスト、期限、時計の動作、デバイス状態を検証するのは SDK のみです。Launch ラッパーは購入日付、ローカル注文、ファイルの存在から許可を推測しません。

デフォルトはメモリのみのアカウントセッションです。永続アカウントストアは記録を暗号化・認証し、OS の認証情報機能で鍵を保護する必要があります。事業者、アカウント、製品、環境ごとに別の書き込み可能なキャッシュを使用してください。ブラウザーレンダラーにはデスクトップアカウントトークン、アサーション、デバイス認証情報ではなく業務結果を渡す必要があります。

## 購入とデバイス

Launch は検証済み決済と変更不可の注文対象期間から絶対的な購入日付を計算し、バージョン付きスナップショットを `/api/v1/launch/connections/{id}/events` に送信します。`applied` になるまでイベントをポーリングし、受信だけでは履行になりません。更新と返金の再試行で期間が二重に追加されることはありません。返金は該当注文の対象期間のみを削除し、全額返金された購入は再購入時に新しい参照に置き換えられます。

デバイスにアクセスできないユーザーは Launch のデバイス管理ページを開けます。一覧、残り解放回数、許可される操作、操作結果は Licentivo から取得します。解放には表示された紐付け世代と変更されない操作 ID を使用します。Launch は競合する解放カウンターやジョブ実行器を保持しません。

## 検証と制限

アカウント交換、一時的なアサーションの保存、SDK が制御する機能実行、通常終了、新しいプロセスでの明示的ログアウト、保留中の解放ジャーナル、製品／環境の分離をテストします。公式 SDK の実際の署名済みリース、オフラインチェック、改ざん拒否は Launch のアカウント通信とは別にテストします。コンパイルとフィクスチャは本番受け入れを証明しません。

Launch はデスクトップログアウト、強制セッションログアウト、パスワード変更、アカウント無効化にも Licentivo V39 の `session-revocations` POST とレシート GET エンドポイントを使用します。元の受信先とリクエストを永続的に固定し、失われた応答を復旧し、環境ごとに独立して確認します。保留中のアカウント全体への通知は新しいデスクトップ認証を停止します。確認後の真に新しいログインでは `auth_time` が最新の `revoked_before` 秒より厳密に後である必要があります。ウェブサイトでの復旧は引き続き可能です。これらの通知は購入日付を変更しません。[境界と復旧の契約](/ja/launch-documents/account-purchase-boundary/)を参照してください。

[手動連携](/ja/launch-documents/manual-integration/)、[AI 連携](/ja/launch-documents/ai-integration/)、[連携パッケージ](/ja/launch-documents/integration-packages/)、[受け入れ確認](/ja/launch-documents/acceptance/)を参照してください。
