Socket.io — Аутентификация при каждом событии сокета для управления сеансом

#node.js #reactjs #socket.io #jwt #middleware

#node.js #reactjs #socket.io #jwt #промежуточное программное обеспечение

Вопрос:

Как использовать промежуточное программное обеспечение аутентификации, которое запускается при каждом событии сокета вместо каждого соединения?

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

Мой вход и выход работают через сокет.ввод-вывод, а не через HTTP.

Комментарии:

1. После подключения сокет. соединение ввода-вывода однозначно принадлежит одной конкретной конечной точке. Эта конечная точка не может измениться во время сокета. подключено соединение ввода-вывода. Итак, неясно, почему или что, по вашему мнению, вам нужно проверять при последующих сообщениях в том же соединении. Как бы вы точно проверили, был ли это один и тот же человек в любом случае? Все, что вы получаете с сокетом. ввод-вывод — это само сообщение. Других учетных данных для аутентификации нет, если клиент не помещает их в сообщение, и в этом случае вы можете просто написать свою собственную функцию для проверки данных внутри сообщения.

2. На самом деле сокет есть. промежуточное программное обеспечение ввода-вывода, которое запускается при каждом сообщении. Оставляя это в стороне, то, что вы сказали, было правильным. Я не был полностью осведомлен о концепции, задавая вопрос. Спасибо за комментарий, объясняющий повторную проверку.

3. На самом деле сокет. функции промежуточного программного обеспечения ввода-вывода вызываются для каждого входящего соединения, а не для каждого входящего сообщения. Они являются отличным местом для проверки подлинности. Это соответствует тому, что jfriend00 объяснил об аутентификации через TCP в целом. socket.io/docs/v4/middlewares

Ответ №1:

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

Итак, неясно, почему или что, по вашему мнению, вам нужно проверять при последующих сообщениях в том же соединении.

С socket.io то, что вы получаете при каждом входящем сообщении, — это само сообщение. Других учетных данных для аутентификации нет, если клиент не помещает их в фактическое сообщение, и в этом случае вы можете просто написать свою собственную функцию для проверки данных внутри сообщения.

Если бы вы вводили учетные данные в каждое сообщение, вы могли бы использовать socket.use() для обработки каждого отдельного входящего сообщения и проверки того, что вы хотели проверить в сообщении.

Комментарии:

1. Очень полезный совет. tnx