Повторно подключите socket.io с аутентификацией JWT - PullRequest
1 голос
/ 02 апреля 2020

Я использую JWT для аутентификации с помощью socket.io. Вот код client :

const socket = io.connect(
            'ws://123.456.789.0:8500',
            {
                query: {
                    token: jwtToken
                },
                transports: ['websocket', 'polling']
            }
        );

Теперь в какой-то момент срок действия jwtToken истекает, и соединение отключается от сервера :

...
io.on('connection', async (socket) => {
    const isExpired = await checkExpireDateEveryMinute(socket.exp, 5);

    if (isExpired) {
        socket.disconnect();
    }

    await socket.on('query', async (data) => {

        ...

    });
});

Как правильно восстановить соединение с клиентом с новым сгенерированным токеном JWT? Не могу найти много ресурсов по этому вопросу. Спасибо.

1 Ответ

1 голос
/ 02 апреля 2020

Я думаю, что лучший способ - использовать функциональность промежуточного программного обеспечения socket.io, которая предотвратит срабатывание обратного вызова on ("connection"), если вы вызовете next () с объектом Error. Он также передаст сообщение об ошибке в интерфейс. Таким способом вы можете отправить токен fre sh и переподключиться.

Вот пример:

async function authenticate(socket,next){
    const isExpired = await checkExpireDateEveryMinute(socket.exp, 5);

    if(isExpired){
        const newToken = getNewToken()//Get a new token...
        next(new Error(newToken))//This will cause an error in your frontend, and pass the new token.
    }else{
        next();
    }
}
io.use(authenticate)//Register the middleware.

Я должен кое-что указать: вы выполняете "ожидание" на socket.on (query, ...), который не имеет смысла.

Что касается вашего интерфейса, он может выглядеть примерно так:

function initSocket(token, url) {

  const socket = io.connect(url, {//Init the socket.
    query: {
      token
    }
  });

  return socket;
}

let socket = initSocket('someToken', 'http://localhost:8000')

socket.on('error', async (error) => {
  if(error === 'TOKEN_EXPIRED'){
    const newToken = await getToken();
    socket.close();
    socket = initSocket(newToken, 'http://localhost:8000')
  }
})

Обратите внимание, что вам нужно будет повторно -регистрация всех событий, которые у вас есть для вашего сокета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...