首页 > 解决方案 > 使用 JWT——在服务器端有没有办法检查用户当前是否登录?

问题描述

使用 JWT 进行用户身份验证时,服务器端是否有任何方法来确定当前是否有一个或多个用户登录?

我手头的用例是发送推送通知——我只想向当前登录的用户发送通知。

标签: expresssessionpush-notificationnotificationsjwt

解决方案


简短的回答

由于服务器正在启动检查用户当前是否连接的过程,因此您需要类似于WebSockets的东西。您可以使用例如Socket.IO

解释

  1. 在客户端和服务器之间建立双向通信通道。
  2. 在服务器上维护当前连接的客户端的所有会话 ID 的列表。如果客户端已经登出,移除对应的ID
  3. 当您要发送推送通知时,请将其发送给与您的会话 ID 列表对应的用户

维护会话 ID 的集合

使用地图来维护连接客户端的集合对于您的用例可能更实用。

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});
  });
}

推荐阅读