私の意見では、サーバーで Google Checkout Polling API を介して GP LVL や IAB 情報を検証しようとするのは最善の方法ではありません。とにかくサーバーがある場合は、はるかに優れたオプションが利用可能です.
記事Securing Android LVL Applicationsで述べたように、最善の方法は、信頼できるサーバーでライセンス情報を検証することです。こんなふうになります:
- Google デモ コードは使用しないでください。堅牢ではなく (すべてのエラー状態をチェックするわけではありません)、応答を偽造するなどのスクリプトに置き換えることもできます (ただし、以下のようにサーバー側のチェックを実装する場合、それは関係ありません)。
com.android.vending.licensing
直接使用してください。Google デベロッパー コンソールのアプリ キーをアプリに含めないでください。アプリには必要ありません。
- アプリはサーバーに呼び出しのノンスを要求します
ILicensingService.checkLicense()
。サーバーは安全なランダムナンスをアプリに提供します。アプリはILicensingService.checkLicense()
そのノンスで呼び出します。
- Android GP LVL サービスは
ILicenseResultListener.verifyLicense()
、署名付きデータと署名を提供する を介してアプリをコールバックします。(ヒント: 署名されたデータにはノンスが含まれているため、ここではリプレイ攻撃も不可能です。)
- アプリは、署名されたデータを署名と共にサーバーに渡します。
- サーバーは、Google デベロッパー コンソールのアプリ キーを認識している唯一のインスタンスです。署名されたデータに対して署名を検証します。
- 検証結果は、サーバー データへのアクセスに関する認証の決定に役立ちます。
- ライセンスをあまり頻繁にチェックしないようにしてください。Google は、ライセンス応答で提供された有効タイム スタンプに従うことを望んでいます (さらに、15 分間の払い戻し期間が反映されていると主張しています)。明らかに、これはサーバー側に有効性を保存し、サーバーがアプリがステップ 2 のテストをスキップできる場合にのみ安全です。
1 つの違いを除いて、同じことが IAB にも当てはまります。残念ながら、IAB V3 は の nonce では機能しませんgetPurchases()
。その理由はおそらく、IAB サービス自体 (Google アプリ側の参照コードだけでなく) がキャッシュを広範囲に使用しているためです。それでも、購入の場合は、返される署名付きデータに含まれるdeveloperPayload
toを渡すことができます。したがって、有効期限の基準がないか、ある種の暗黙的(時間ベース) またはサーバー管理の明示的である限り、com.android.vending.billing.IInAppBillingService.getBuyIntent()
getPurchases()
アプリ内購入の有効期限の基準はありませんが、API はまだ十分に安全です。サーバーは期限切れのアイテムを消費するようにアプリに要求しますが、それが失敗してもサーバーはそれを認識しており、アイテムを何度も消費するようにアプリに要求できるため、問題はありません。
このトピックについて少し光を当てることができれば幸いです。