Как правильно организовать аутентификацию пользователя при работе с Sockets?
В процессе разработки сервиса, в котором предполагается реализовать реалтайм общение пользователей, возник вопрос, связанный с аутентификацией. Технически чат будет организован с помощью сокетов, и, по сути, весь процесс можно разбить на три этапа:
1. Устанавливается соединение (Сокет).
И в рамках этого соединения:
2. Пользователь отправляет сообщение.
3. Пользователь получает сообщение.
Логин и пароль пользователя хранятся в переменных сессии/куках.
Так вот сам вопрос: стоит ли проводить аутентификацию на каждом этапе, т.е. при отправке сообщения и получении или достаточно только при создании Сокета? или возможно есть какое-то другое решение?
Под аутентификацией понимается запрос к бд для сверки логина и пароля.
1. Клиент и сервер формируют общий ключ.
2. Клиент шифрует и отсылает пароль и логин на сервер.
3. Сервер проверяет наличие данного пользователя.
4. В случае совпадения логина и пароля клиенту дается сессионная метка.
5. При отправке сообщения отправляется и метка, если она «жива», то сообщение находит адресата.
6. Время от времени обновляется «метка».
При пройденной аутентификации (вот тут можно и нужно слазить в БД) на сокет заводится handshake.id, действующий на всё время подключения, и разные socket.id — на каждой из открытых страниц.
Обновлять «метки», как было предложено выше, смысла нет, достаточно уникального айди хендшейка.
2 сервера
Логин сервер, принимает коннект, проверяет юзера. Если логин/пароль верны, генерит ключ и переключает клиента на второй сервер, который получив утвердительный ответ от 1-го начинает выполнять нужные действия.