7

「Clash of Clans」は、Game Center を使用してプレイヤーを認証し、リモートに保存されている既存のゲーム ステートとリンクします。

私が見る限り、ゲームにはクライアント側のプレーヤー識別子のみが提供されます。識別子のみを送信する代わりにユーザーを安全に認証するサポートされている手法はありますか (これは、ユーザー名のみで認証するのと同じです)?

4

2 に答える 2

2

私が質問して以来、Apple は新しい API を導入しました。答えは、Setting up third-party server to interact with Game Center (ありがとう、user2949759) および他のいくつかの場所で入手できます。

具体的には、iOS 7 以降 ( Wayback Machine の Apple ドキュメント):

-[GKLocalPlayer generateIdentityVerificationSignatureWithCompletionHandler:]

サードパーティ サーバーがローカル プレーヤーを認証できるようにする署名を生成します。

関連するコールバック ブロックの引数には、、、、が含まれNSURL *publicKeyUrlます。これらは、プレーヤーのととともに、「ログイン情報」としてサーバーに送信する必要があります。NSData *signatureNSData *saltuint64_t timestampplayerIDbundleID

  • この時点で、サーバー側でpublicKeyURL公開鍵を取得するために使用する必要があります
  • サーバー側で、この公開鍵が Apple によって署名されていることを確認します
  • サーバー側で、UTF-8 でエンコードされplayerIDた 、bundleID、ビッグエンディアンのuint64タイムスタンプ、および verbatimを連結しますsalt
  • サーバー側で、上記の SHA-256 を生成して生成しますdigest
  • signatureサーバー側で、サーバーに出荷された が正しいことを確認し、以前にダウンロードした公開鍵を使用しsignatureて、とdigest

疑似 PHP例、Objective-C でこれを実装する方法の例(逐語的に使用するのはほとんど意味がありません)、Go 実装Ruby 実装があり、同じものに他の言語でさまざまな実装があります。質問。

当然のことながら、Go での実装は特に読みやすいように見えますが、公開鍵が Apple によって発行されたものであることは確認されていません。リンクされた Ruby の実装には、それを行う方法のかなり明確な例が含まれています。

于 2015-09-24T11:52:28.383 に答える
0

独自のサーバーで認証しているので、これはクライアントとサーバーの間で実装するものです。GameCenterはあなたを助けることができなくなります。

簡単なアイデアは、自分だけが知っている関数を使用してハッシュを計算しplayerID、サーバーにそれをクライアントが送信しているものと比較させることです。

クライアントを初めて実行するときにランダムキーを生成することは避けてください。クライアントを再インストールすると、ユーザーがロックアウトされるためです。

于 2013-01-07T18:38:17.723 に答える