Редактировать: После публикации я понял, что это почти тот же самый ответ, который дал Али.С (немного другой, но общий подход тот же.) Он начался как нечто совершенно иное.
Этот метод предполагает, что все коммуникации проходят через серию безопасных туннелей. Как вы этого достигнете, не имеет значения. Я бы предложил TLS, но это только я.
- Клиент => Игровой сервер Клиент подключается к игровому серверу и инициирует сеанс входа в систему.
- Игровой сервер => Сервер аутентификации. Игровой сервер подключается к серверу аутентификации и запрашивает токен идентификатора сеанса с сервера аутентификации. Это соединение остается открытым для прослушивания успешного / неудачного входа в систему.
- Игровой сервер => Клиент Маркер идентификатора сеанса отправляется обратно клиенту.
- Клиент => Сервер аутентификации Клиент отправляет идентификатор сеанса на сервер аутентификации вместе с именем пользователя и паролем пользователя, а также некоторую информацию о сервере (IP, открытый ключ TLS и т. Д. См. Сноски)
- Сервер аутентификации => Игровой сервер Затем сервер аутентификации отправляет информацию о входе в систему на игровом сервере (состояние успеха, имя пользователя, статистика и т. Д.), Используя идентификатор сеанса, предоставленный клиентом.
- Игровой сервер => Клиент Игровой сервер сообщает клиенту, что аутентификация прошла успешно, и пропускает их.
- Все соединения, кроме первоначального подключения клиента к игровому серверу, теперь разорваны.
Кроме того, вы можете назначить игровым серверам выделенный порт для прослушивания входа в систему. Если вы выберете этот маршрут, то поток будет выглядеть так:
- Клиент => Сервер аутентификации Клиент отправляет имя пользователя, пароль и IP-адрес сервера на сервер аутентификации.
- Сервер аутентификации => Игровой сервер + Клиент Если вход в систему успешен, сервер аутентификации отправляет уникальный токен игровому серверу и клиенту. Также отправьте IP-адрес клиента на игровой сервер, чтобы токен не был украден.
- Клиент => Игровой сервер. Затем клиент отправляет токен на игровой сервер, где он затем проверяется и удаляется на игровом сервере. Затем игровой сервер впускает клиента.
Этот второй подход сделает общую реализацию немного проще.
Примечания:
Причина, по которой я указываю, что некоторая информация об игровом сервере должна быть отправлена на сервер аутентификации, состоит в том, чтобы обезопасить процесс от подделок. Сервер может проверить информацию, чтобы убедиться, что он авторизует соединение, которое ожидает игрок.
Идентификаторы сеансов не обязательно должны быть криптографически безопасными, хотя в этом случае подделка соединений будет несколько сложнее.
Если вы решите пойти по маршруту TLS, вы можете настроить подписывающий сервер, который подписывает все сертификаты, используемые вашей инфраструктурой, и добавить его в качестве доверенного ЦС в клиент-серверном программном обеспечении. Пока вы не позволите своему сертификату подписи ослабнуть, вы сможете обеспечить некоторую достойную аутентификацию.
Ради смягчения DoS-атак установите время ожидания соединения через 20 или менее секунд. Если он длится дольше, значит, что-то не так, и вам не нужно ждать 3 минуты, ожидая, пока соединение не отключится само по себе.