express - 使用 JWT——在服务器端有没有办法检查用户当前是否登录?
问题描述
使用 JWT 进行用户身份验证时,服务器端是否有任何方法来确定当前是否有一个或多个用户登录?
我手头的用例是发送推送通知——我只想向当前登录的用户发送通知。
解决方案
简短的回答
由于服务器正在启动检查用户当前是否连接的过程,因此您需要类似于WebSockets的东西。您可以使用例如Socket.IO
解释
- 在客户端和服务器之间建立双向通信通道。
- 在服务器上维护当前连接的客户端的所有会话 ID 的列表。如果客户端已经登出,移除对应的ID
- 当您要发送推送通知时,请将其发送给与您的会话 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});
});
}
推荐阅读
- python - 使用上一行和当前行比较进行迭代时出现问题跳过行
- java - 使用 java jsoup 登录在站点 rotowire 上不起作用
- ruby-on-rails - Devise::PasswordsController 中实际更新的用户密码在哪里?
- android - 我的 gridView 没有显示在 mainactivity
- javascript - 带有三元组的 Javascript 函数语法 =>
- angular-cli - 使用 @angular-builders/custom-webpack 使用 --watch 在 Angular 构建后添加任务
- ms-access - MS-Access Pro Plus 2016“无法使用”
'; 文件已在使用”Win 10 Pro 64 位 v1909 - javascript - 无法正确使用语义标签
- c# - Visual Studio 解决方案中嵌入式数据库的 SQL 连接字符串
- javascript - 模拟 javascript ES6 构造函数的可接受方式?