Использование JWT - на стороне сервера есть ли способ проверить, вошел ли пользователь в данный момент? - PullRequest
0 голосов
/ 06 января 2019

При использовании JWT для аутентификации пользователя, есть ли способ на стороне сервера определить, вошли ли в данный момент один или несколько пользователей?

У меня есть вариант использования для отправки push-уведомлений, где я хочу отправлять уведомления только тем пользователям, которые в данный момент вошли в систему.

1 Ответ

0 голосов
/ 06 января 2019

Краткий ответ

Поскольку сервер инициирует процесс проверки, подключен ли пользователь , в данный момент , вам необходимо что-то похожее на WebSockets . Вы можете использовать, например, Socket.IO

Объяснение

  1. Установить двусторонний канал связи между клиентом и сервером.
  2. На сервере ведется список всех идентификаторов сеансов клиентов , в данный момент подключен. Если клиент вышел из системы, удалите соответствующий идентификатор
  3. Если вы хотите отправить push-уведомление, отправьте его пользователям, соответствующим вашему списку идентификаторов сеансов

Ведение коллекции идентификаторов сеансов

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

const sessionsMap = {};

io.on('connection', (socket) => {
  const sessionId = socket.id;

  socket.emit('askForJWT');

  socket.on('receivedJWT', (jwt) => {
    if (isValid(jwt)) {
      const userId = extractUserIdFromJWT(jwt);
      sessionsMap[sessionId] = userId;
    }
  });

  socket.on('disconnect', () => {
    delete sessionsMap[sessionId];
  });
});

Отправка уведомления

Перебирайте значения внутри карты, чтобы отправить их (используя выбранный вами API) уведомление.

function sendNotification(message) {
  const listOfUsersIds = Object.values(sessionsMap);

  listOfUsersIds.forEach((userId) => {
    // Here you send the notification with your API of choice
    api.send({message, userId});
  });
}
...