「Clash of Clans」は、Game Center を使用してプレイヤーを認証し、リモートに保存されている既存のゲーム ステートとリンクします。
私が見る限り、ゲームにはクライアント側のプレーヤー識別子のみが提供されます。識別子のみを送信する代わりにユーザーを安全に認証するサポートされている手法はありますか (これは、ユーザー名のみで認証するのと同じです)?
「Clash of Clans」は、Game Center を使用してプレイヤーを認証し、リモートに保存されている既存のゲーム ステートとリンクします。
私が見る限り、ゲームにはクライアント側のプレーヤー識別子のみが提供されます。識別子のみを送信する代わりにユーザーを安全に認証するサポートされている手法はありますか (これは、ユーザー名のみで認証するのと同じです)?
私が質問して以来、Apple は新しい API を導入しました。答えは、Setting up third-party server to interact with Game Center (ありがとう、user2949759) および他のいくつかの場所で入手できます。
具体的には、iOS 7 以降 ( Wayback Machine の Apple ドキュメント):
-[GKLocalPlayer generateIdentityVerificationSignatureWithCompletionHandler:]
サードパーティ サーバーがローカル プレーヤーを認証できるようにする署名を生成します。
関連するコールバック ブロックの引数には、、、、が含まれNSURL *publicKeyUrl
ます。これらは、プレーヤーのととともに、「ログイン情報」としてサーバーに送信する必要があります。NSData *signature
NSData *salt
uint64_t timestamp
playerID
bundleID
publicKeyURL
公開鍵を取得するために使用する必要がありますplayerID
た 、bundleID
、ビッグエンディアンのuint64
タイムスタンプ、および verbatimを連結しますsalt
digest
signature
サーバー側で、サーバーに出荷された が正しいことを確認し、以前にダウンロードした公開鍵を使用しsignature
て、とdigest
疑似 PHPの例、Objective-C でこれを実装する方法の例(逐語的に使用するのはほとんど意味がありません)、Go 実装、Ruby 実装があり、同じものに他の言語でさまざまな実装があります。質問。
当然のことながら、Go での実装は特に読みやすいように見えますが、公開鍵が Apple によって発行されたものであることは確認されていません。リンクされた Ruby の実装には、それを行う方法のかなり明確な例が含まれています。
独自のサーバーで認証しているので、これはクライアントとサーバーの間で実装するものです。GameCenterはあなたを助けることができなくなります。
簡単なアイデアは、自分だけが知っている関数を使用してハッシュを計算しplayerID
、サーバーにそれをクライアントが送信しているものと比較させることです。
クライアントを初めて実行するときにランダムキーを生成することは避けてください。クライアントを再インストールすると、ユーザーがロックアウトされるためです。