2016-04-07 43 views
0

我在Node.js应用程序中使用最新版本的Express(4.x)和Passport.js(0.13)。我可以通过使用req.user并使用工作的对象来获取路由中的当前用户对象。但是,对于路由之外的情况,是否有我可以调用的方法或可以访问的包含相同信息的全局对象?使用Passport.js获取路由之外的当前用户

我想这样做的原因是我有一个Socket.io侦听器,它等待一个消息字符串发送。然后它获取当前登录的用户,获取他们的ID并将其用于数据库关联。这显然发生在路线之外。

回答

1

Passport.js使用会话来反序列化用户并将其存储在express.js req对象中。因此,要在Socket.io中对用户进行身份验证,您需要使用cookie查找会话,在会话存储中查找会话并最终从会话中获取用户。

您可以使用Socket.io middlewares来实现此目的。这里是一个伪代码,让你开始:

var io = require('socket.io')(); 
io.use((socket, next) => { 
    if (socket.request.headers.cookie) { 
    // find the session id in cookie 
    const sessionID = socket.request.headers.cookie['connect.sid'] 

    // lookup the sessionID in session store 
    MongoStore.get(sessionID, (err, session) => { 
     // get the userID from the session 
     const userID = session.passport.user; 
     // Lookup user using the UserID 
     User.find(userID, (err, user) => { 

     //save the user in socket 
     socket.user = user; 
     next(); 
     }) 

    }) 
    } 
    next(new Error('Authentication error')); 
}); 
+0

这太棒了。非常感谢你,绝对实现我想做的事情。 –