Socket.io: как бороться с аутентифицированным клиентом, который открывает два окна? - PullRequest
0 голосов
/ 31 октября 2011

Я кодирую игровой сервер HTML5.Сервер содержит список совпадений, и когда пользователь присоединяется к одному из совпадений, он может видеть ход игры, а также общаться с другими пользователями и т. Д.

Когда пользователь присоединяется к совпадению,сервер ищет в своем объекте сеанса строку «идентификатор пользователя».Строка userid ссылается на объект пользователя.Если он не найден, создается новый объект пользователя, и к объекту сеанса добавляется строка 'userid'.

Это позволяет пользователю подключаться к нескольким играм с использованием нескольких вкладок / окон, при этом по-прежнему отображаетсято же имя пользователя, отображать картинку в каждом окне.

Теперь проблема заключается в том, что один и тот же пользователь подключался к одному и тому же совпадению более одного раза.Если у пользователя есть два окна, подключенных к одной и той же игре, я хочу, чтобы они видели в обоих окнах одну и ту же вещь - что-то вроде чата Facebook.

В настоящее время, когда пользователь подключается к матчу, появляется новый 'объект соединения создан, и на этом объекте я обрабатываю события сокетов и т. д.

То, что я надеялся сделать, - это обрабатывать события нескольких сокетов, используя одну и ту же функцию-обработчик событий.Единственное, что меня останавливает, это то, что события сокета не имеют аргумента «владелец».Без ссылки на сокет, получающий сообщение, я не могу транслировать сообщение на все сокеты, кроме того, которое получило сообщение.

Комнаты SocketIO также не соответствуют моим требованиям, потому что нет событий длясообщения, полученные по каналу.

Вместо этого я вынужден учитывать наличие как объекта подключения, так и объекта участника, где у каждого участника есть несколько подключений.Мне это кажется очень раздутым.

Другой вариант - попытаться заставить себя писать, используя код для спагетти, использовать замыкания и т. Д.

Действительно нужен совет от кого-то, кто был ваналогичная ситуация.

1 Ответ

3 голосов
/ 01 ноября 2011

Productish Solution: Заставить пользователя использовать одно окно.

Если пользователь уже подключен и поскольку сервер знает это, во втором окне отобразится диалоговое окно, подобное

У вас уже есть другое окно, открытое с AwesomeGame. Пожалуйста, используйте это окно или нажмите кнопку ниже.

Использовать это окно

Если пользователь нажимает кнопку, отправьте сообщение через SocketIO, утверждая, что это соединение является тем, которое представляет пользователя. Затем сервер уведомит все предыдущие соединения о том, что они были заменены.

Инженерное решение: Предоставьте каждому клиенту токен, который он может использовать для аутентификации на сервере с помощью SocketIO.

Когда HTML генерируется и подается, включите идентификатор пользователя на странице и подпишите его с помощью секретного ключа, известного серверу. Например, наш токен выглядит так:

<user id>|<salt>|<SHA1 hash of uid + salt + secret key>

Когда клиент подключается, игнорируйте все сообщения, пока клиент не пройдет аутентификацию, предоставив подписанный токен. Сервер может разбить токен и проверить, что этот клиент SocketIO действительно представляет этого пользователя.

На сервере используйте систему pubsub для подписки открытых соединений SocketIO с идентификаторами пользователей. Когда сообщение связано с конкретным пользователем, опубликуйте его с идентификатором пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...