編集:これを投稿した後、私はそれがAli.Sによって与えられたものとほぼ同じ答えであることに気付きました(わずかに異なりますが、全体的なアプローチは同じです)。
この方法は、すべての通信が一連の安全なトンネルを介して行われていることを前提としています。これをどのように達成するかは重要ではありません。TLSをお勧めしますが、それは私だけです。
- クライアント=>ゲームサーバークライアントはゲームサーバーに接続し、ログインセッションを開始します。
- ゲームサーバー=>認証サーバーゲームサーバーは認証サーバーに接続し、認証サーバーにセッションIDトークンを要求します。この接続は、ログインの成功/失敗をリッスンするために開いたままになります。
- ゲームサーバー=>クライアントセッションIDトークンがクライアントに送り返されます。
- クライアント=>認証サーバークライアントは、ユーザーのユーザー名とパスワード、およびサーバーに関するいくつかの情報(IP、TLS公開鍵など。脚注を参照)とともに、セッションIDを認証サーバーに送信します。
- 認証サーバー=>ゲームサーバー認証サーバーは、クライアントから提供されたセッションIDを使用して、ログインに関する情報(成功の状態、ユーザー名、統計など)をゲームサーバーに送信します。
- ゲームサーバー=>クライアントゲームサーバーは、認証が成功したことをクライアントに通知し、認証を許可します。
- 最初のクライアントからゲームサーバーへの接続を除くすべての接続が切断されます。
または、ゲームサーバーにログインをリッスンするための専用ポートを与えることもできます。このルートを選択すると、フローは次のようになります。
- クライアント=>認証サーバークライアントはユーザー名、パスワード、サーバーIPを認証サーバーに送信します。
- 認証サーバー=>ゲームサーバー+クライアントログインが成功すると、認証サーバーはゲームサーバーとクライアントに一意のトークンを送信します。トークンが盗まれないように、クライアントのIPもゲームサーバーに送信します。
- クライアント=>ゲームサーバー次に、クライアントはトークンをゲームサーバーに送信し、そこでトークンが検証されてゲームサーバーで削除されます。その後、ゲームサーバーはクライアントを許可します。
この2番目のアプローチでは、全体的な実装が少し簡単になります。
脚注:
ゲームサーバーに関する情報を認証サーバーに送信する必要があると私が指定した理由は、なりすましに対するプロセスを強化するためです。サーバーは情報を検証して、プレーヤーが期待する接続を承認していることを確認できます。
セッションIDは暗号的に安全である必要はありませんが、スプーフィング接続を行うと、なりすましが困難になります。
TLSルートを選択する場合は、インフラストラクチャで使用されるすべての証明書に署名する署名サーバーをセットアップし、クライアント/サーバーソフトウェアで信頼できるCAとして追加できます。署名証明書が緩まない限り、適切な認証を提供できます。
DoS攻撃を緩和するために、20秒以下で接続をタイムアウトにします。それよりも長く続く場合は、問題が発生しており、接続がタイムアウトするのを3分間待つ必要はありません。