套接字IO:使用有效负载的jwt进行身份验证

时间:2020-08-14 12:00:23

标签: node.js sockets socket.io jwt

我正在尝试验证socket.io中间件中的JWT令牌,并将JWT有效负载放入套接字中,以便稍后在通信时访问它,但是我无法访问有效负载。

这就是我试图将JWT有效负载放入套接字的方式:

var server = require('http').Server(app); // intantiating the server
var io = require('socket.io')(server);
io.use(async (socket, next) => {
    try {
        const token = socket.handshake.query.token;
        const payload = await jwt.verify(token, process.env.ACCESS_TOKEN_SECRET);
        socket.user_id = payload.user_id;
        next();
    } catch (err) {
        next(err);
    }
});

之后,我可以在这里访问user_id

io.on("connection", (socket) => {
    console.log("Connected: " + socket.user_id); // works
    socket.on("disconnect", () => {
        console.log("Disconnected: " + socket.user_id); // works
    });
});

但是在这里我无法访问user_id:

io.of('/chatroom').on('connection', function(socket) {
    socket.on('join', function() {
        console.log(socket.user_id) // null
    })
})

如何获取join事件中user_id的值?

2 个答案:

答案 0 :(得分:0)

我通过在/ chatroom路径中添加中间件来解决该问题,

io.use(async (socket, next) => {
    try {
        const token = socket.handshake.query.token;
        const payload = await jwt.verify(token, process.env.ACCESS_TOKEN_SECRET);
        socket.user_id = payload.user_id;
        next();
    } catch (err) {
        next(err);
    }
});
io.of('/chatroom').use(async (socket, next) => {
    try {
        const token = socket.handshake.query.token;
        const payload = await jwt.verify(token, process.env.ACCESS_TOKEN_SECRET);
        socket.user_id = payload.user_id;
        next();
    } catch (err) {
        next(err);
    }
});

答案 1 :(得分:0)

通常来说,使用第三方库的内部组件来存储您自己的数据是一种不好的做法。您基本上应该将此数据存储在某个位置,并在[socketId](实际上是用于标识通过套接字连接到服务器的用户的socket.io方法)与[userId](这是您标识自己的方法)之间的映射用户)。

现在,有很多实现,取决于您的可伸缩性,资源,维护等。在这里我将建议一些,您可以阅读和实现。

  1. 一个简单的Singleton类,您将在其中存储某种类型的一个或多个数据结构(可能是哈希图),并在其中映射[socketId]和[userId]。请注意,只有正在运行的进程才能在运行时获取它。

  2. 这是一个更加耗时和耗资源的解决方案,但具有更高的可扩展性。您可以使用某种内存数据库,例如Redis来存储此数据。 请注意,如果您扩展应用程序,则所有实例都可以从Redis获取数据,因为它可以接受来自所有进程的连接。

我确信还有更多解决方案,但是我的建议是开始实施其中一种,并查看您是否需要任何其他实施。