Editar: Después de publicar esto, me di cuenta de que es casi la misma respuesta dada por Ali.S (ligeramente diferente, pero el enfoque general es el mismo). Sin embargo, comenzó como algo completamente diferente.
Este método supone que todas las comunicaciones se mantienen en una serie de túneles seguros. Cómo lograr esto no importa. Sugeriría TLS, pero solo soy yo.
- Cliente => Servidor del juego El cliente se conecta al servidor del juego e inicia una sesión de inicio de sesión.
- Servidor de juegos => Servidor de autenticación El servidor de juegos se conecta al servidor de autenticación y solicita un token de ID de sesión del servidor de autenticación. Esta conexión se mantiene abierta para escuchar el inicio / error de inicio de sesión.
- Game Server => Cliente El token de ID de sesión se envía de vuelta al cliente.
- Cliente => Servidor de autenticación El cliente envía la ID de sesión al servidor de autenticación junto con el nombre de usuario y la contraseña del usuario, y cierta información sobre el servidor (IP, clave pública TLS, etc. Ver notas al pie)
- Servidor de autenticación => Servidor de juegos El servidor de autenticación envía información sobre el inicio de sesión al servidor de juegos (estado de éxito, nombre de usuario, estadísticas, etc.) utilizando el ID de sesión proporcionado por el cliente.
- Servidor de juegos => Cliente El servidor de juegos le dice al cliente que la autenticación fue exitosa y los deja entrar.
- Todas las conexiones, excepto la conexión inicial del cliente al servidor del juego, ahora se eliminan.
Alternativamente, puede dar a los servidores del juego un puerto dedicado para escuchar los inicios de sesión. Si elige esta ruta, el flujo se vería así:
- Cliente => Servidor de autenticación El cliente envía el nombre de usuario, la contraseña y la IP del servidor al servidor de autenticación.
- Auth Server => Game Server + Client Si el inicio de sesión es exitoso, el servidor de autenticación envía un token único al servidor y al cliente del juego. Envíe también la IP del cliente al servidor del juego, para que no se pueda robar el token.
- Cliente => Servidor del juego El cliente envía el token al servidor del juego, donde luego se verifica y elimina en el servidor del juego. El servidor del juego luego deja entrar al cliente.
Este segundo enfoque facilitaría un poco la implementación general.
Notas al pie:
La razón por la que especifico que se debe enviar cierta información sobre el servidor del juego al servidor de autenticación es para endurecer el proceso contra las falsificaciones. El servidor puede verificar la información para asegurarse de que está autorizando la conexión que el jugador espera.
Las ID de sesión no tendrían que ser criptográficamente seguras, aunque haría que las conexiones de suplantación fueran algo más difíciles si lo fueran.
Si elige ir a la ruta TLS, puede configurar un servidor de firma que firme todos los certificados utilizados por su infraestructura y agregarlo como una CA confiable en el software cliente / servidor. Mientras no permita que su certificado de firma se pierda, podrá proporcionar una autenticación decente.
En aras de mitigar los ataques DoS, agota el tiempo de espera de las conexiones después de 20 segundos o menos. Si dura más que eso, entonces algo está mal y no necesita esperar 3 minutos esperando que la conexión se agote por sí sola.