Bearbeiten: Nachdem ich dies gepostet hatte, wurde mir klar, dass es fast genau die gleiche Antwort von Ali.S ist (etwas anders, aber der Gesamtansatz ist der gleiche.) Es begann jedoch als etwas völlig anderes.
Bei dieser Methode wird davon ausgegangen, dass die gesamte Kommunikation über eine Reihe sicherer Tunnel erfolgt. Wie Sie dies erreichen, spielt keine Rolle. Ich würde TLS vorschlagen, aber das bin nur ich.
- Client => Spieleserver Der Client stellt eine Verbindung zum Spieleserver her und initiiert eine Anmeldesitzung.
- Spieleserver => Authentifizierungsserver Der Spieleserver stellt eine Verbindung zum Authentifizierungsserver her und fordert vom Authentifizierungsserver ein Sitzungs-ID-Token an. Diese Verbindung wird offen gehalten, um auf den Erfolg / Misserfolg der Anmeldung zu warten.
- Game Server => Client Das Sitzungs-ID-Token wird an den Client zurückgesendet.
- Client => Authentifizierungsserver Der Client sendet die Sitzungs-ID zusammen mit dem Benutzernamen und dem Kennwort des Benutzers sowie einigen Informationen zum Server (IP, öffentlicher TLS-Schlüssel usw. siehe Fußnoten) an den Authentifizierungsserver.
- Auth Server => Game Server Der Auth Server sendet dann Informationen über die Anmeldung an den Game Server (Erfolgsstatus, Benutzername, Statistiken usw.) unter Verwendung der vom Client bereitgestellten Sitzungs-ID.
- Spieleserver => Client Der Spielserver teilt dem Client mit, dass die Authentifizierung erfolgreich war, und lässt sie ein.
- Alle Verbindungen mit Ausnahme der ursprünglichen Verbindung zwischen Client und Spielserver werden jetzt abgebrochen.
Alternativ können Sie den Spielservern einen dedizierten Port zum Abhören von Anmeldungen zuweisen. Wenn Sie diese Route wählen, sieht der Ablauf folgendermaßen aus:
- Client => Authentifizierungsserver Der Client sendet den Benutzernamen, das Kennwort und die Server-IP an den Authentifizierungsserver.
- Auth Server => Game Server + Client Wenn die Anmeldung erfolgreich ist, sendet der Auth Server ein eindeutiges Token an den Game Server und den Client. Senden Sie die IP des Clients auch an den Spieleserver, damit das Token nicht gestohlen werden kann.
- Client => Spieleserver Der Client sendet das Token dann an den Spieleserver, wo es überprüft und auf dem Spieleserver gelöscht wird. Der Spieleserver lässt dann den Client ein.
Dieser zweite Ansatz würde die Gesamtimplementierung etwas erleichtern.
Fußnoten:
Der Grund, warum ich spezifiziere, dass einige Informationen über den Spieleserver an den Authentifizierungsserver gesendet werden sollen, besteht darin, den Prozess gegen Parodien abzusichern. Der Server kann die Informationen überprüfen, um sicherzustellen, dass er die vom Player erwartete Verbindung autorisiert.
Sitzungs-IDs müssten nicht kryptografisch sicher sein, obwohl dies das Spoofing von Verbindungen etwas erschweren würde.
Wenn Sie sich für die TLS-Route entscheiden, können Sie einen Signaturserver einrichten, der alle von Ihrer Infrastruktur verwendeten Zertifikate signiert, und ihn als vertrauenswürdige Zertifizierungsstelle in der Client / Server-Software hinzufügen. Solange Sie nicht zulassen, dass sich Ihr Signaturzertifikat löst, können Sie eine anständige Authentifizierung bereitstellen.
Um DoS-Angriffe abzuschwächen, stellen Sie nach 20 oder weniger Sekunden eine Zeitüberschreitung für Verbindungen her. Wenn es länger dauert, stimmt etwas nicht und Sie müssen nicht 3 Minuten warten, bis die Verbindung von selbst eine Zeitüberschreitung aufweist.