Как использовать аутентификацию веб-сокетов, используя node, ws и passport с JWT? - PullRequest
0 голосов
/ 31 января 2020

У меня есть веб-сервер, написанный в узел / express, который использует паспорт для аутентификации пользователей с помощью JSON веб-токенов (JWT).

Для обычные методы HTTP это то, что я использую:

app.get('/api/stuff', isLoggedIn(), (req, res) => {
    //get stuff
    res.send( whatever );
});

Где isLoggedIn - это функция:

function isLoggedIn() {
    return passport.authenticate('local-jwt', { session: false });
}

Сама аутентификация обрабатывается конфигурацией 'local-jwt' в паспорте с использованием JWTStrategy объект, и он работает как положено.

Теперь мне нужно добавить веб-сокеты в это приложение. Я использую библиотеку ws . Вот что у меня есть:

const wss = new WebSocket.Server({
    port: 8080,
    verifyClient: async (info, done) => {
        // ???
        done( result );
    }
});

wss.on('connection', ws => {
    // web socket events
});

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

1 Ответ

1 голос
/ 01 февраля 2020

Вы можете sign токен с идентификатором пользователя или чем-либо еще, что вы используете для разграничения пользователей

var today = new Date();
var exp = new Date(today);
exp.setDate(today.getDate() + 60);
jwt.sign({
        id: user._id,
        exp: parseInt(exp.getTime() / 1000),
    }, secret);

, затем передать токен во внешний интерфейс и использовать его для инициализации соединения через Websocket с добавлением его к затем URL-адрес берет и декодирует его на сервере следующим образом:

const wss = new WebSocket.Server({
  verifyClient: async (info, done) => {
    console.log(info.req.url);
    console.log('------verify client------');

    const token = info.req.url.split('/')[1];
    var decoded = jwt.verify(token, secret);

    info.req.user = await User.findById(decoded.id).exec();

    /*info.req.user is either null or the user and you can destroy the connection
     if its null */

    done(info.req);
  },
  server
});

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

...