使用 Passport.js 获取路由之外的当前用户
Get the current user outside of a route using Passport.js
我在我的 Node.js 应用程序中使用最新版本的 Express (4.x) 和 Passport.js (0.13)。我可以通过使用 req.user
并使用该对象来获取路由内的当前用户对象,这很有效。但是,对于路由之外的情况,是否有我可以调用的方法或我可以访问的包含相同信息的全局对象?
我想这样做的原因是我有一个 Socket.io 侦听器等待发送消息字符串。然后它获取当前登录的用户,获取他们的 ID 并将其用于数据库关联。这显然发生在路线之外。
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'));
});
我在我的 Node.js 应用程序中使用最新版本的 Express (4.x) 和 Passport.js (0.13)。我可以通过使用 req.user
并使用该对象来获取路由内的当前用户对象,这很有效。但是,对于路由之外的情况,是否有我可以调用的方法或我可以访问的包含相同信息的全局对象?
我想这样做的原因是我有一个 Socket.io 侦听器等待发送消息字符串。然后它获取当前登录的用户,获取他们的 ID 并将其用于数据库关联。这显然发生在路线之外。
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'));
});