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.
Der Client sollte einen privaten und einen öffentlichen Schlüssel haben.
Der private Schlüssel sollte die eindeutige Kennung sein, die der Client vom Authentifizierungsserver erhält. Der öffentliche Schlüssel sollte auch an den Client gesendet werden.
Bevor der Client eine Verbindung zu einem Spieleserver herstellt, sollte er eine Nachricht mit seinem privaten Schlüssel und der IP-Adresse des Spieleservers, zu dem er eine Verbindung herstellen möchte, an den Authentifizierungsserver senden. Der Authentifizierungsserver sollte dann die Übereinstimmung für den privaten Schlüssel überprüfen und finden und den öffentlichen Schlüssel in seinen Datensätzen speichern.
Der Spieleserver, zu dem der Client eine Verbindung herstellt, sollte nach Erhalt des öffentlichen Schlüssels des Clients eine Anforderung an den Authentifizierungsserver senden. Wenn der Authentifizierungsserver überprüfen kann, ob der Client eine Verbindung zu dieser IP des Spielservers herstellen möchte, senden Sie, dass der Client in Ordnung ist. Der Spieleserver sollte dann dem Client erlauben, eine Verbindung herzustellen.
Der private Schlüssel wird nur zur Authentifizierung des Clients verwendet, damit der Spieleserver nicht die echte Authentifizierungs-ID erhält.
quelle
Es gibt mehrere Lösungen, an die ich denken kann, aber hier ist die sicherste:
Beachten Sie, dass der Spieleserver in diesem Szenario tatsächlich keine Möglichkeit zum Abhören hat, obwohl die gesamte Authentifizierung durchlaufen wird. Aus dem gleichen Grund kann Ihr ISP nicht überwachen, welche Pakete Sie an Facebook senden oder von Facebook kommen.
quelle
Ich würde dies tun, indem ich den Auth-Server nach der Anmeldung ein Token an den Client senden lasse, zusammen mit einer Liste der validierten Spieleserver (damit der Client sicher sein kann, dass der Spieleserver gültig ist).
Dann würde der Client das Token an den Spieleserver senden, der es dann an den Auth-Server senden würde, um zu bestätigen, dass dies der gültige Client ist.
Anmeldung:
Später beim Beitritt zu einem Spieleserver:
quelle
Wie wäre es, wenn Sie ein JWT- Token mit einem Geheimnis signieren, das nur der zentrale Authentifizierungs- und Player-Server kennt? Damit können Sie json signieren, was später überprüft werden kann.
quelle