Modifica: dopo aver pubblicato questo mi sono reso conto che è quasi la stessa identica risposta data da Ali.S (leggermente diverso ma l'approccio generale è lo stesso.) È iniziato come qualcosa di completamente diverso.
Questo metodo presuppone che tutte le comunicazioni siano mantenute su una serie di tunnel sicuri. Non importa come raggiungi questo obiettivo. Suggerirei TLS, ma sono solo io.
- Client => Server di gioco Il client si connette al server di gioco e avvia una sessione di accesso.
- Server di gioco => Server di autenticazione Il server di gioco si collega al server di autenticazione e richiede un token ID di sessione dal server di autenticazione. Questa connessione è mantenuta aperta per ascoltare l'esito positivo / negativo dell'accesso.
- Game Server => Client Il token ID sessione viene inviato al client.
- Client => Server di autenticazione Il client invia l'ID di sessione al server di autenticazione insieme al nome utente e alla password dell'utente e ad alcune informazioni sul server (IP, chiave pubblica TLS, ecc. Vedi le note a piè di pagina)
- Server di autenticazione => Server di gioco Il server di autenticazione invia quindi informazioni sull'accesso al server di gioco (stato di successo, nome utente, statistiche, ecc.) Utilizzando l'ID sessione fornito dal client.
- Game Server => Client Il server di gioco comunica al client che l'autent ha avuto successo e li fa entrare.
- Tutte le connessioni ad eccezione della connessione iniziale tra client e server di gioco sono state demolite.
In alternativa, puoi assegnare ai server di gioco una porta dedicata per ascoltare gli accessi. Se scegli questa rotta, il flusso sarebbe simile al seguente:
- Client => Server di autenticazione Il client invia il nome utente, la password e l'IP del server al server di autenticazione.
- Server di autenticazione => Server di gioco + client Se l'accesso ha esito positivo, il server di autenticazione invia un token univoco al server di gioco e al client. Invia anche l'IP del client al server di gioco, in modo che il token non possa essere rubato.
- Client => Server di gioco Il client invia quindi il token al server di gioco, dove viene quindi verificato ed eliminato sul server di gioco. Il server di gioco consente quindi al client di entrare.
Questo secondo approccio renderebbe un po 'più semplice l'implementazione complessiva.
Note:
Il motivo per cui specifico che alcune informazioni dovrebbero essere inviate sul server di gioco al server di autenticazione è di rafforzare il processo contro gli spoofing. Il server può verificare le informazioni per assicurarsi che stia autorizzando la connessione prevista dal lettore.
Gli ID di sessione non dovrebbero essere crittograficamente sicuri, anche se renderebbero le connessioni di spoofing un po 'più difficili se lo fossero.
Se si sceglie di seguire il percorso TLS, è possibile configurare un server di firma che firma tutte le certificazioni utilizzate dalla propria infrastruttura e aggiungerlo come CA attendibile nel software client / server. Finché non lasci che il certificato di firma si allenti, sarai in grado di fornire un'autenticazione decente.
Per mitigare gli attacchi DoS, effettuare il timeout delle connessioni dopo 20 o meno secondi. Se dura più a lungo, qualcosa non va e non è necessario attendere 3 minuti in attesa del timeout della connessione da solo.