Launch SDK アカウントログアウト再試行の修正
日付:2026-10-24。AUTH-07 を修正し、Go、JavaScript、Python、C#、Java、Ruby、Rust、C、C++ のアカウントライフサイクルエントリーポイントを同期しました。デプロイ、SDK の公開、Git のコミットやプッシュは行っていません。 このタスクでは Launch または Licentivo のサーバー側業務コードを変更していません。
動作
明示的なログアウトではまず安全なストレージのアカウント記録を「失効待ちのみ」とマークし、公式 SDK のログアウトを呼び出してから Launch にアカウントセッションの失効を送信します。ネットワークやキャンセルの状態にかかわらずローカルランタイムは停止し、保護された機能の実行を継続できません。
Launch が失効を確認していない場合、SDK は保留タスクと再試行に必要な元のアカウント認証情報を保持しますが、ログイン済みアカウントとは見なしません。再度 Logout、Login、Restore を行うと失効リクエストを復旧します。Restore は保留タスクを使って ID を要求したり認可ランタイムを起動したりしません。成功レスポンス、または元のセッションで認証できなくなったことを示す HTTP 401 を受け取って初めてアカウントの保留タスクを削除します。そのため応答が失われても復旧でき、「2 回目のログアウトは成功したが失効を再送していない」という状態は発生しません。
通常のログイン済み記録は引き続き v2 と互換です。失効待ち記録は非公開の v3 形式を使用します。Java と Rust では通常ログインに必要な認証情報フィールドの形状も削除し、旧 SDK が保留タスクを通常ログインと誤認するのを防ぎます。保留タスクには短期 ID アサーション、ライセンスキー、署名済み許可を保存しません。
アカウントの保留タスクは元から設定された安全な Store を使用します。プロセスをまたぐ復旧には永続的な安全なストレージが必要です。例えば Windows DPAPI または SDK がサポートする暗号化ストレージを使用します。デフォルトの MemoryStore は現在のプロセス内でのみデータを保持します。再試行は後続のログイン、復元、ログアウト操作で開始され、独立したバックグラウンドタスクは追加されていません。ストレージまたは失効が未完了の場合はエラーまたは未完了の結果を返し、成功と表示しません。
Licentivo SDK のデバイスログアウトチケットと .logout.json は引き続き同 SDK が管理します。Launch はそのキャッシュディレクトリを削除せず、デバイス、機能、オフライン権限を判断しません。ネイティブサンプルと各言語の SDK ドキュメントも同期して更新しました。
検証
| 範囲 | 結果 |
|---|---|
| Launch Go ソースパッケージ | サブケースを含む 185 件の合格記録。失敗なし。go vet 成功 |
| 実際の Launch HTTP と MySQL | ログアウトリクエスト中断後も安全な保留タスクを保持。SDK 再構築後もログインを復元できず、ネットワーク復旧後に失効を再送。旧 token の認証と ID API はどちらも拒否を返す |
| JavaScript | 10 項目が成功。ログアウト失敗、再構築後の復旧、401 確認を含む |
| Python | 8 項目が成功。ログアウト後のローカルアカウント消去、再構築後の復旧、Windows DPAPI を含む |
| C# | ライフサイクル、保留タスクの復旧、SDK ログアウトログの保持、DPAPI チェックが成功 |
| Java | 7 組のライフサイクルとセキュリティテストが成功。オフラインログアウト再試行を含む |
| Ruby | アカウントライフサイクル、保留タスク復旧、暗号化ストレージの回帰が成功 |
| Rust | 保留タスクの再構築後の復旧と実際の SDK 実行を含む、すべてのローカルテストが成功 |
| C / C++ | 実際の署名 SDK、ネットワーク切断後の再構築と復旧、401 確認、DPAPI、C++ 実行エントリーポイントが成功 |
| 現在の Licentivo 認可修正 | 45 件のテスト合格記録。失敗・スキップなし。ポリシーのずれがある場合の否定通知、低容量デバイスの調整、手動デバイス上限、既存認可の回帰を含む |
| 組み込み公式 SDK | マニフェストの 115 ファイルのハッシュがすべて一致。認可または暗号実装は変更していません |
Launch ソース回帰では TestMySQLBaseline、TestProductUploadRoundTrip、TestInitialAdministratorMustChangePasswordBeforeAdministration、TestNewPaymentProvidersAndRegistrationWithoutMail の 4 テストが他の専用データベースに依存するためスキップされ、合格には数えていません。今回の SDK、アカウント HTTP、購入同期、マッピングフローは独立したテストデータベースで検証しました。
両側の連携テスト
ローカルの独立した MySQL 8.0.32、現在の Launch、Licentivo サービスとそのワーカープロセス、実際の Go Launch SDK と公式認可ランタイム、DPAPI アカウントストレージを使用して 15 の業務段階を完了しました。
2 種類のログアウト障害検証を追加しました:
- リクエストが Launch に届かない:アカウントログアウト API が一時的に 503 を返します。SDK はローカル機能を停止し、実際の Licentivo デバイス紐付けが解放され、アカウント失効の保留タスクが保持されます。SDK 再構築後もログアウトのみを再試行し、接続復旧後、元の Launch セッションが失効し、Licentivo は対応するセッション通知の受信を確認します。
- サーバーは失効済みだが応答が失われた:Launch はログアウトを処理済みで、テストプロキシがレスポンスを 503 に置き換えます。保留タスクは SDK 再構築をまたいで保持され、接続復旧後、HTTP 401 で元のセッションの失効を確認して保留タスクを削除します。この間ログインの復元やデバイスの再アクティベーションはありません。
その他の段階では実際の購入同期と署名済み機能の実行、通常終了からの復元、通常ログアウト、リモート解除と旧世代、更新返金、アカウント失効と再ログイン、全額返金後の実行拒否、返金復旧、チャージバック、大規模文書の翻訳回帰を対象としました。Licentivo の 3 件の更新はその担当者が提供し、このタスクではビルドと検証のみを行いました。
決済チャネルと DeepL は隔離された模擬サービスを使用し、実際の請求、返金、有料翻訳はありません。実サービスの統合検証は Go を使用し、他の言語はローカル SDK 回帰を完了しました。9 言語それぞれで実サービスのデプロイ受け入れを完了したとは主張しません。
今回は 192.168.2.177 にアクセスしていません。MySQL と Licentivo の一時プロセスはすべて停止し、既存サービスとテスト証拠は保持しました。元資料は .local/logout-retry-fix-20261024/ にあり、要約とソースハッシュは検証証拠を参照してください。