Edit: Après avoir posté cela, j'ai réalisé que c'était presque exactement la même réponse donnée par Ali.S (légèrement différente mais l'approche globale est la même.) Cela a commencé comme quelque chose de complètement différent.
Cette méthode suppose que toutes les communications sont maintenues sur une série de tunnels sécurisés. Peu importe comment vous y parvenez. Je proposerais TLS, mais c'est juste moi.
- Client => Game Server Le client se connecte au serveur de jeu et lance une session de connexion.
- Game Server => Auth Server Le serveur de jeu se connecte au serveur d'authentification et demande un jeton d'ID de session au serveur d'authentification. Cette connexion est maintenue ouverte pour écouter la réussite / l'échec de la connexion.
- Game Server => Client Le jeton d'ID de session est renvoyé au client.
- Client => Serveur Auth Le client envoie l'ID de session au serveur Auth avec le nom d'utilisateur et le mot de passe de l'utilisateur, et quelques informations sur le serveur (IP, clé publique TLS, etc. Voir les notes de bas de page)
- Serveur d' authentification => Serveur de jeu Le serveur d'authentification envoie ensuite des informations sur la connexion au serveur de jeu (état de réussite, nom d'utilisateur, statistiques, etc.) à l'aide de l'ID de session fourni par le client.
- Serveur de jeu => Client Le serveur de jeu informe le client que l'authentification a réussi et lui permet d'entrer.
- Toutes les connexions, à l'exception de la connexion initiale du client au serveur de jeu, sont désormais interrompues.
Alternativement, vous pouvez donner aux serveurs de jeu un port dédié pour écouter les connexions. Si vous choisissez cette route, le flux devrait ressembler à ceci:
- Client => Auth Server Le client envoie le nom d'utilisateur, le mot de passe et l'adresse IP du serveur au serveur d'authentification.
- Serveur d'authentification => Serveur de jeu + client Si la connexion réussit, le serveur d'authentification envoie un jeton unique au serveur de jeu et au client. Envoyez également l'IP du client au serveur de jeu, afin que le jeton ne puisse pas être volé.
- Client => Game Server Le client envoie ensuite le jeton au serveur de jeu, où il est ensuite vérifié et supprimé sur le serveur de jeu. Le serveur de jeu laisse ensuite entrer le client.
Cette deuxième approche faciliterait un peu la mise en œuvre globale.
Notes de bas de page:
La raison pour laquelle je spécifie que certaines informations doivent être envoyées sur le serveur de jeu au serveur d'authentification est de renforcer le processus contre les usurpations. Le serveur peut vérifier les informations pour s'assurer qu'il autorise la connexion attendue par le lecteur.
Les identifiants de session n'auraient pas à être cryptographiquement sécurisés, bien que cela rendrait les connexions d'usurpation un peu plus difficiles s'ils l'étaient.
Si vous choisissez de suivre la route TLS, vous pouvez configurer un serveur de signature qui signe tous les certificats utilisés par votre infrastructure et l'ajouter en tant qu'autorité de certification de confiance dans le logiciel client / serveur. Tant que vous ne laissez pas votre certificat de signature se desserrer, vous pourrez fournir une authentification décente.
Pour atténuer les attaques DoS, effectuez le délai d'expiration des connexions après 20 secondes ou moins. Si cela dure plus longtemps que cela, alors quelque chose ne va pas et vous n'avez pas besoin d'attendre 3 minutes pour que la connexion expire d'elle-même.