アプリケーションはAndroidリモートサービスのクライアントであり、すべてのユーザーがアカウントを持ち、非消耗品の購入を行うことができます。各購入は、購入したアカウントに関連付けられています。現在の購入スキームは次のとおりです。
このスキームで何がうまくいかないのでしょうか?たとえば、署名がどこでも使用されていないことが心配です。ただし、サーバーがGoogle Playから直接データを受信する場合、その用途はわかりません。最悪の場合、間違ったトークンを受け取る可能性がありますが、ペイロードにはユーザーIDが含まれているため、別のアカウントで購入された場合、購入は拒否されます。同じトークンを2回送信しても、その製品は非消費型であるため、役に立たない:購入したか、購入していない。しかし、私はここで何かを見逃しているのでしょうか、それとも他に目に見えない欠陥があるのでしょうか?
質問の本当の意味がわかりません。
それが確認されていない場合、あなたの質問はもっとあると思います、署名は何に使用されていますか?また、ここで署名の用途を説明できます。署名は、基になるアカウントシステムがなく、Googleアカウントシステムも使用していない場合に使用されます。
その場合、署名された購入データをGoogleサーバーからアプリに受け取ります。ここで、ユーザーがそれを改ざんできる、つまり、購入していないものを購入したと改ざんできるという問題が発生します。
検証するUserIDもないため、購入トークンのみを使用した場合、ユーザーはトークンを互いに共有できます。
これが署名が効力を発揮するものです。アプリ/クライアント/ユーザーからデータを受け取ったら、有料サービスへのアクセスをレンダリングする前に、データが改ざんされていないことを確認できます。また、ここでは、リクエストでランダムなナンスを提供できます。これは、レスポンスで提供されます。ユーザーは自分の購入以外の購入の購入データを取得できないため、プレミアムコンテンツの共有を効果的に防止できます。
スキームの上に購入データの検証を追加すると、さらに安全になりますが、この場合、UserIDに対してトークンを検証しているので、これは必要ありません。
あなたは正しいです、私もこのスキームで何の問題も見ていません。 Googleが架空の購入についてサーバーに嘘を付け始めた場合、その時点では支払いプロバイダーを完全に切り替える必要があるため、署名が役立つとは思えません。