Launch の購入期間とアカウント SDK の境界
今回の変更はローカルでの開発と検証のみで、Launch のデプロイや SDK パッケージの公開は行っていません。現在のソースは Licentivo のアカウント認可プロトコルと対応する公式 SDK の更新に依存し、長期ライセンスキーのみをサポートする旧サーバーと併用できません。
責務
| 機能 | 担当 |
|---|---|
| 登録、ログイン、アカウントセキュリティ、商品、注文、決済、返金 | Launch |
| 更新/アップグレードの見積もり、購入サイクル、絶対的な開始・終了時刻の計算 | Launch |
| プラン参照からライセンス製品/ポリシーへのマッピング実行とポリシー検証 | Licentivo。Launch は選択と登録の入口を提供 |
| ライセンス、機能権限、デバイス枠、認可セッション、オフラインライセンス | Licentivo と公式 SDK |
| デバイス一覧とリモート紐付け解除 | Licentivo。Launch は現在のアカウントのリクエストを代理し、結果を表示 |
| ログイン認証情報の保存、アカウント復元、ログアウトの入口 | Launch SDK |
Launch の注文、購入期間、同期完了マークはいずれも保護された機能へのアクセスを許可できません。クライアントは公式 SDK の RunFeature などのランタイム API を通して保護された業務を実行する必要があります。
各 Launch 製品は安定した公開 Licentivo 製品ルートを 1 つ保存します。同じ製品のプランでは異なるポリシーを選択できますが、別のリモート製品に切り替えることはできません。マッピングの保存は共通製品のデータベース行ロックを通じて直列に検証されます。顧客 ID、プラン公開、SDK 連携設定は同じ紐付けを読み取り、ドラフトは購入済み顧客の製品コンテキストを変更できません。これは連携設定の整合性のみを検証し、機能やデバイスの認可は決定しません。旧データベースに安定したフィールドがない場合は購入および公開履歴を優先して参照し、一意に確認できない場合は PRODUCT_MAPPING_CONFLICT を返します。詳細はマッピングの並行処理修正を参照してください。
購入期間の同期
既存 API を再利用し、決済事実、返金事実、見積もりサービスを追加しません:
POST /api/v1/launch/connections、PUT /connections/{id}:ID 署名公開鍵を登録し、本番環境とテスト環境でそれぞれ接続を作成します。PUT /api/v1/launch/connections/{id}/plans/{plan}:重複できない Launch プランバージョン参照とリモート製品、ポリシーバージョンを登録します。POST /api/v1/launch/connections/{id}/events:完全なバージョン付き購入スナップショットを送信します。GET /api/v1/launch/connections/{id}/events/{event}:処理結果を確認します。POST /api/v1/launch/connections/{id}/events/{event}/retry:照合後、元のイベントを再試行します。
スナップショットにはイベント番号、環境、イベント種別、購入参照、匿名アカウント参照、Launch 製品、プランバージョン参照、増加するバージョン、絶対的な valid_from / valid_until のみを含め、移行時は旧ライセンス ID を添付します。決済キー、価格、顧客のメールアドレス、長期ライセンスキーは送信しません。永久購入の valid_until は null で、ポリシーとの一致は Licentivo が検証します。
Launch は同じデータベーストランザクション内で支払いを確認し、変更不可の購入対象期間を記録して同期タスクを保存します。日/月/年の暦サイクルに基づいて期限を計算します。更新は元の購入基準日を引き継ぎ、期限切れ後に支払われた場合のみ実際の支払い時刻から開始します。アップグレードの見積もりと期間は引き続き Launch で計算します。
変更のたびに完全な絶対値を送信し、再試行では同じイベント ID と同じ本文を使用します。「さらに N 日追加」は送信しません。タスクはリクエスト、リモート接続、処理状況を永続化し、応答の喪失、プロセスの再起動、並行ワーカープロセスによって期間が重複して加算されることはありません。
HTTP 202 は Licentivo が受信したことのみを意味します。applied を受け取った場合にのみ同期完了とし、pending は照会を継続し、manual_review と確認できない stale は照合待ち状態を保持します。ネットワークエラーはバックオフして再試行し、連続失敗が上限に達すると手動照合に移ります。
返金は対応する注文の対象期間のみを削除します。アップグレード注文の返金では基本プランを復元し、更新注文の返金では対応する延長部分を削除します。未返金の購入が残る場合は再計算結果を同期し、すべての購入を失効させません。すべての購入が返金された後に entitlement.refunded を送信します。後で再購入する場合は新しい購入参照を使用し、失効済みのリモートライセンスが復活するのを防ぎます。
チャネルが確認した敗訴チャージバックまたは支払い取り消しも、対応する注文の購入対象期間のみを削除します。注文は reversed と表示され、実際のライセンス変更は Licentivo が購入スナップショットを適用した後に処理されます。保留中の紛争は購入記録を変更しません。過去の照合待ち取り消し通知は、元のチャネルで署名を再検証して再送することで復旧できます。
結果不明の返金が手動照合に入った後、管理者は POST /api/v1/admin/refunds/{id}/reconcile で元の操作を復旧できます。レシートは元の取引、通貨、金額と一致する必要があります。元の操作番号と承認時刻を変更してはいけません。安全な再試行期間を過ぎた後、資金リクエストを盲目的に再送してはいけません。
アカウントとクライアント
- クライアントは
POST /api/v1/auth/loginを使用して実際のデスクトップログインセッションを確立します。 - Launch SDK は
POST /api/v1/software/products/{id}/identityを要求し、sandboxまたはliveを指定します。 - Launch は最大 120 秒間有効で、受信者と製品/購入コンテキストを指定した ID アサーションを発行します。実際のログイン
sidとログイン期限を含みます。アサーションには機能、デバイス枠、オフライン権限は含まれません。 - Launch SDK は
identity_token、launch_connection_id、environmentをメモリ内でのみ公式 SDK に渡し、license_keyは空にします。 - 公式 SDK は Licentivo の
/api/v1/launch/exchangeを呼び出し、Licentivo が認可を判断してデバイス認証情報と署名済みライセンスを発行します。
Launch の通常アカウント記録は v2 を使用し、アカウントセッションと公開ルート情報のみを保存します。アサーション、ライセンスキー、ライセンス許可は保存しません。明示的なログアウト時には失効専用の非公開 v3 保留タスクに移行し、ログインとして復元できません。Launch セッションの失効を確認してから削除します。旧 /credential API は HTTP 410 を返します。公開鍵と製品 ID はアプリとともに配布できますが、管理キーはサーバー側にのみ保持します。
ログアウト、終了、リモート紐付け解除
| 操作 | 動作 |
|---|---|
| 通常の Close / Dispose / Drop | ランタイムを停止し、購入、デバイス紐付け、明示的に記憶したアカウントを保持 |
| Logout / ReleaseDevice 互換エントリーポイント | ローカルアカウントをログアウト済みとしてマークし、公式 SDK のログアウトを呼び出した後、Launch にセッションの失効を要求。未確認のアカウントログアウトは安全な保留タスクとして保持 |
| デバイスにアクセスできない場合、Launch でデバイスを管理 | Licentivo のデバイス一覧、紐付け解除リクエスト、処理結果を代理 |
公式 SDK のログアウトはこのプロセスでのライセンス使用を直ちに停止し、そのランタイム認証情報を消去して、専用のログアウトチケットでリモート紐付けを失効させます。ネットワーク障害時は SDK の .logout.json を保持し、リモート失効が未完了であることを表示する必要があります。紐付け解除の成功を表示してはいけません。Launch SDK は公式 SDK のキャッシュディレクトリを削除、走査して消去、変更することはありません。失効待ちチケットは対応するキャッシュが再度初期化された後、公式 SDK が処理を復旧します。
Launch アカウントのログアウトにも独立した保留状態があります。ネットワーク障害、キャンセル、応答の喪失時は、再試行に必要な安全な記録を削除しません。再ログイン、復元、ログアウト時には元のセッション失効のみを再送し、保留タスクをログインの復元に使用することはできません。成功または HTTP 401 によりセッションの失効が確認された後に削除します。プロセスをまたぐ復旧には永続的な安全な Store が必要で、MemoryStore は現在のプロセス内でのみ有効です。詳細はログアウト再試行の修正と連携テストを参照してください。
リモート紐付け解除リクエストは元の一覧で返された activation_id と expected_generation を含み、再試行では operation_id を再利用します。Launch は解除回数を計算せず、解除キューを独自に承認または実行せず、世代を更新して古い操作を自動再試行することもしません。残り回数、解放の可否、審査、最終結果はすべて Licentivo から取得します。
アカウント復元 Restore はネットワークに接続してアカウントを確認し、新しい ID アサーションを取得する必要があります。Launch はアカウントサービス障害時に独自にオフラインアクセスを許可しません。オフライン起動が必要なアプリは公式 SDK の復元契約に従って連携します。署名、オフライン期限、時計のチェックは引き続き公式 SDK が行います。
サーバー側の ID 失効
Licentivo V39 の既存 API に連携し、商用事実や見積もり API は不要です:
POST /api/v1/launch/connections/{id}/session-revocations:指定したsidまたはアカウントの古いログインを失効させ、同期的にコミットされたレシートを返します。GET /api/v1/launch/connections/{id}/session-revocations/{event_id}:元のイベントのコミット済み結果を取得し、応答が失われたリクエストを復旧します。
通常のデスクトップログアウトと指定セッションの強制ログアウトには scope=session を使用します。パスワード変更、パスワードリセット、メールアドレス変更、アカウント無効化、ウェブサイト担当者のロール変更による全セッション失効には scope=account を使用します。ウェブサイトセッションの通常ログアウトは顧客ソフトウェアに影響しません。Launch は ID が失効したことのみを通知し、リモート認可セッション、ランタイム認証情報、デバイス解放はすべて Licentivo が処理します。購入期間を変更せず、Launch が管理する紐付け解除枠も消費しません。
ローカルセッションの失効と通知のキュー登録は同じトランザクション内で完了します。キューはその時点で既に存在する接続と環境を固定し、同じイベント ID、匿名アカウント識別子、元のリクエストで再試行します。後から作成された接続は過去のアカウント失効を受け取りません。まず元のレシートを照会し、存在しないと確認された場合にのみ再送します。各環境の結果は個別に永続化され、すべてで一致する成功レシートを受け取った場合にのみ完了と表示します。ネットワーク切断時は自動再試行し、認証情報/契約の競合は手動照合に移ります。管理者は同期タスクページで通知を確認して再試行できます。再試行で新しい失効イベントは生成されません。
アカウント範囲の失効は Licentivo が最初に受け付けた revoked_before を境界とします。通知が未完了の間は新しいデスクトップログインと ID アサーションを停止します。完了後、実際のログインの auth_time は全環境のレシートにあるカットオフ秒より厳密に後である必要があります。同じ秒のログインは後で再認証できます。iat や ID アサーションを更新して古いログインを継続することはできません。ウェブサイトへのログインは引き続き復旧操作に使用できます。アカウントの再有効化後も再ログインが必要で、古いセッションは復元しません。
旧データの移行
確認済みの旧ライセンス紐付けがある購入には entitlement.migrated を使用し、旧ライセンス ID のみを送信します。旧キーは読み取らず発行もしません。Licentivo が移行を確認した後、独立した新バージョンのスナップショットを送信して現在の商用期間と状態を同期します。未確認の旧発行結果や互換性のないライセンスには手動照合が必要です。旧管理コマンドは自動的に再実行されません。
通常の SDK ログアウト、リモートデバイス紐付け解除、サーバー側 ID 失効はいずれも既存 API に連携します。リモート無効化は引き続き公式 SDK が発行済みのオフラインライセンスの期限に制約されます。Launch はオフラインデバイスが即時に失効を受け取ることを保証しません。
アカウントのログアウトには独立した安全な保留タスク、ローカルセッションのログアウト要約、プロセス間の調整を使用し、古いインスタンスは自分のログインのみを処理します。ストレージ障害後の復旧では先にアカウント失効を再送し、ID の取得や認可の開始は行いません。機能、オフラインライセンス、デバイス世代、紐付け解除枠は引き続き Licentivo が決定します。詳細は修正と両側の連携テスト記録を参照してください。