Как правильно организовать аутентификацию пользователя при работе с Sockets?

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

1. Устанавливается соединение (Сокет).

И в рамках этого соединения:

2. Пользователь отправляет сообщение.

3. Пользователь получает сообщение.



Логин и пароль пользователя хранятся в переменных сессии/куках.



Так вот сам вопрос: стоит ли проводить аутентификацию на каждом этапе, т.е. при отправке сообщения и получении или достаточно только при создании Сокета? или возможно есть какое-то другое решение?

Под аутентификацией понимается запрос к бд для сверки логина и пароля.
  • Вопрос задан
  • 2836 просмотров
Пригласить эксперта
Ответы на вопрос 4
@Jurik
Я бы предложил такую схему:

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

Войдите, чтобы написать ответ

Похожие вопросы