Аутентификация с помощью ws WebSocket - PullRequest
0 голосов
/ 19 января 2020

Я использую ws webSocket (не могу использовать socket.io), и я немного новичок в этом. Я знаю, как это работает, но не совсем понимаю пару вещей.

  1. Как я могу аутентифицироваться с использованием jwt? В документах говорится, что использование события upgrade является правильным способом go, но когда клиент подключился, код в функции upgrade не запустился.

  2. Как правильно добавить тип события? В socket.io можно слушать, используя client.on('eventType', function). Что такое эквивалент WebSocket?

  3. Когда и зачем использовать пути в webSocket ws?

Обновление

Событие обновления не запускается с моей стороны. Вот код, который у меня есть:

Файл 1

const server = require('http').createServer(app);
require('./socket/socket')(server);

Файл 2

module.exports = function(server) {
    const WebSocket = require('ws');

    const wss = new WebSocket.Server({ port: 8080 });

    server.on('upgrade', function(request, socket, head) {
        console.log('Upgraded');

        wss.handleUpgrade(request, socket, head, function(ws) {
            wss.emit('connection', ws, request);
        });
    });

    wss.on('connection', function connection(ws) {
        ws.on('message', function incoming(message) {
            console.log('received: %s', message);
        });
    });
};

Ответы [ 2 ]

0 голосов
/ 19 января 2020

Как я могу пройти аутентификацию, используя jwt? В документах говорится, что использование события обновления - правильный путь к go, но когда клиент подключился, код в функции обновления не запустился.

Ну, есть много разных вариантов. Вы можете передать токен как параметр запроса пользовательского заголовка при первом установлении соединения. Вы могли бы потребовать, чтобы первые данные, отправленные через webSocket, были токенами и отключаться, если такой токен не прибывает скоро и первым. Если клиент уже прошел проверку подлинности и существует http-повар ie, который указывает на это, вы можете проверить этот повар ie при подключении через веб-сокет.

Как правильно добавить тип события? В socket.io можно слушать, используя client.on ('eventType', функция). Что такое эквивалент WebSocket?

Типы сообщений socket.io (или типы событий, как вы их называете) - это то, что socket.io добавляет поверх webSocket. Сам протокол webSocket не имеет такой вещи. Вы отправляете пакет данных, и этот пакет данных поступает на другой конец. Все пакеты данных имеют один и тот же «тип» webSocket. Если вы хотите идентифицировать ваши пакеты данных как сообщения определенного типа, то вам нужно придумать способ сделать это внутри своих данных обратно. Например, если ваши данные были отформатированы в JSON, вы можете добавить свойство type: "someType" к сообщению о событии и затем проверить это свойство при получении (это, по сути, то, что делает socket.io, хотя и делает это вне полезной нагрузки socket.io). ).

Когда и зачем использовать пути в webSocket ws?

У вас может быть две совершенно разные части кода, которые используют webSocket для разных вещей, которые не имеют ничего в общем и находятся в отдельных модулях, и для каждого из них проще иметь собственное подключение к WebSocket. И они могут использоваться двумя совершенно разными типами клиентов.

Как получить доступ к оригинальному URL, когда клиент webSocket подключается к вашему серверу, отображается здесь на событии upgrade вашего сервера, используемом с библиотекой ws.

В этом примере вы заметите, что событие upgrade происходит на сервере http, а не на экземпляре сервера websocket.

0 голосов
/ 19 января 2020
  1. с предоставлением аутентификации примеров . Они работают, когда HTTP-сервер сначала обрабатывает запросы авторизации. Затем передайте запрос на обновление HTTP на ws, а не на сам прослушивающий порт. Обратите внимание на параметр noServer: true, который они включают в настройку:

    const wss = new WebSocket.Server({ clientTracking: false, noServer: true });
    

    Компонент jwt будет проще, если сначала использовать koa или express в HTTP, а затем выполнить обновление таким образом. В противном случае вам потребуется написать обработчик ws message, чтобы найти некоторые данные токена и проверить их.

  2. message - это событие в ws. Вы можете написать что-нибудь более конкретное c поверх события message, что является большой причиной для использования socket.io, который сделал все это для вас (включая функции обратного вызова клиента, которые очень полезны).

  3. Использование пути URI в запросе на обновление ws:// или http обычно означает подключение к отдельному контексту ws на стороне сервера. Простой способ пространства имен или разделения соединения на отдельные группы.

...