【发布时间】:2015-05-17 22:46:23
【问题描述】:
我正在使用带 express 的 passportJS 通过本地策略对用户进行身份验证。我看过几篇关于如何设置护照和执行流程的文章。虽然护照的大部分内容都可以通过搜索找到,但用户的序列化和反序列化让我感到困惑。
我了解它用于将用户信息保存在会话中以进行持久登录。我的序列化和反序列化代码是
passport.serializeUser(function(user, done){
done(null, user.id);
});
passport.deserializeUser(function(id, done){
User.findById(id, function(err, user){
done(err, user);
});
});
我的问题
1) 谁调用和填充serializeUser 和deserializeUser 的参数?以及它如何访问用户对象?为了理解这一点,我添加了类似
的日志 passport.serializeUser(function(user, done){
console.log(arguments.callee.caller);
done(null, user.id);
});
并在输出中得到 [Function: pass] 谁能解释一下?
2) 我正在使用 mongodb 来存储用户信息。 MongoDB 将 _id 作为文档的默认 id。所以理想情况下,serializeUser 和 deserializeUser 应该使用 user._id 而不是 user.id。但它与用户对象中不可用的 user.id 一起工作正常。这是控制台中打印的用户对象
{ _id: 5505f231b810dbd4098ac76a,
__v: 0,
google: {},
twitter: {},
facebook: {},
local:
{ password: '$2a$08$9NGd0xNu0JbWMZ07ufyFRu8guwy147k8IBl5cAC4Y8APOuxreNI32',
email: 'xxxx@xxx.com' } }
这怎么可能?
3) 执行done 方法后,控制流执行到哪里?
【问题讨论】:
标签: node.js express mongoose passport.js