使用JWT-在服务器端是否可以检查用户当前是否登录?

时间:2019-01-06 09:47:11

标签: express session push-notification notifications jwt

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

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

1 个答案:

答案 0 :(得分:0)

简短回答

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

说明

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

维护会话ID的集合

使用 map 维护连接的客户端的集合对于您的用例而言可能更为实用。

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