新手请教Nodejs nodeclub源码的github授权问题
新手请教Nodejs nodeclub源码的github授权问题
最近在看nodeclub源码,卡在了github授权部分,一直没看懂passport的两个方法,serializeUser和deserializeUser两个方法的作用,看了官方文档的解释:
Passport will maintain persistent login sessions. In order for persistent sessions to work, the authenticated user must be serialized to the session, and deserialized when subsequent requests are made.
英文不太好,大概意思是:为了维持登陆状态,将已授权user信息序列化为(serializeUser)字符串保存到session, 当产生后续请求时从session中反序列化(deserializeUser)出用户对象信息user。
nodeclub中是这样做的(注释是我自己的理解):
// github oauth
passport.serializeUser(function (user, done) {
done(null, user); // user是一个包含用户信息的对象,这里将对象序列化为string保存到session中
});
passport.deserializeUser(function (user, done) {
done(null, user); // 这里是反序列化得到的用户信息对象,应该是要挂在req.user中的
});
但是在我测试的时候发现deserializeUser的回掉函数一直没被运行,一直搞不明白,求大牛解释啊。
额,没人回答,只好自己说了,因为nodeclub没有使用passport.session()中间件的原因。
正在研究这一部分内容,学习怎么写个微博登陆。
serializeUser
和 deserializeUser
是 Passport.js 中用于处理用户认证会话管理的方法。具体来说:
serializeUser
方法负责将经过验证的用户对象转换成一个简化的形式,并将其存储在会话中。这通常意味着将复杂的对象转换为字符串或简单的键值对。deserializeUser
方法则负责从会话数据中恢复用户对象。
在你的例子中,serializeUser
和 deserializeUser
的实现过于简单,导致 deserializeUser
并没有按预期执行。以下是一个更标准的实现示例:
// serializeUser 方法:将用户对象简化并存储在会话中
passport.serializeUser(function(user, done) {
// 通常我们只会存储用户的 ID,而不是整个用户对象
done(null, user.id);
});
// deserializeUser 方法:根据会话中存储的用户 ID 恢复用户对象
passport.deserializeUser(async function(id, done) {
try {
const user = await User.findById(id); // 假设 User 是你的 Mongoose 模型
if (!user) {
return done(null, false);
}
done(null, user);
} catch (err) {
done(err);
}
});
在这个示例中:
serializeUser
只存储了用户的id
而不是完整的用户对象,这样可以减少会话存储的数据量。deserializeUser
使用findById
方法从数据库中获取用户对象,并将其传递给回调函数done
。
如果你的 deserializeUser
回调函数没有被调用,可能是因为会话中间件未正确配置,或者会话存储存在问题。请确保你的应用正确地设置了会话中间件,例如使用 express-session
和 connect-mongo
或其他会话存储方式。
如果仍然有问题,请检查你的日志输出,查看是否有任何错误信息。