我不了解passport.js中的一些内容。
1。
var passport = require('passport')
, LocalStrategy = require('passport-local').Strategy;
passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, function (err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
if (!user.validPassword(password)) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user);
});
}
));
null
在done()
函数中代表什么。似乎总是第一个参数,我对实际上是什么感到困惑?2。
passport.serializeUser(function(user, cb) {
cb(null, user);
});
passport.deserializeUser(function(obj, cb) {
cb(null, obj);
});
序列化和反序列化有什么作用?当 session 存储在浏览器中时,登录后是否会调用序列化?反序列化是指访问页面时,以便在服务器上反序列化 session 以验证该用户吗?
最后,
null
中的cb(null, user);
参数又是什么 最佳答案
按照惯例,NodeJS使用错误优先回调,这意味着回调函数的第一个参数始终是错误对象。如果没有任何错误,请传入null
。换句话说,如果error参数是null
,则操作成功;如果error参数不是null
,则发生错误。这对于您询问的所有示例均适用。如果看一下代码,您会发现您已经在利用此代码:
User.findOne({ username: username }, function (err, user) {
if (err) {
// Error happened and passed as first argument
return done(err);
}
// ...
// no error so we pass in null
return done(null, user);
此外,Passport具有其身份验证过程的约定,如其文档所述:
那就是你在这里做的:
User.findOne({ username: username }, function (err, user) {
// ...
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
if (!user.validPassword(password)) {
return done(null, false, { message: 'Incorrect password.' });
}
// ...
好吧,Passport的文档说:
这意味着,在用户登录后,会调用
serializeUser
,并将您传递给回调cb
的用户数据:passport.serializeUser(function(user, cb) {
cb(null, user); // <-- this user object
});
被保存在 session 存储区(通常是浏览器cookie)中,并在代码中的
req.session.passport.user
处可用。当用户重新连接到您的页面时(通过刷新或离开并返回),该数据将作为第一个参数传递给
deserializeUser
,以用于检索用户对象。passport.deserializeUser(function(obj, cb) {
cb(null, obj); // <-- obj is the same `user` object you used in serializeUser
});
您在这里所做的是将实际的
user
对象传递给serializeUser
中的回调,然后将该相同的对象通过deserializeUser
中的回调传递回来。这意味着您将整个用户对象存储在cookie中,可以随便玩耍,但通常不是一个好主意,因为cookie存储是有限的,而且用户信息通常很敏感。执行此操作的典型方法是将用户ID(而不是整个用户对象)传递给
cb
中的serializeUser
,以使 session 中存储的数据量较小。当进一步的请求发生时,此id传递给deserializeUser
并用于通常从数据库中查找实际的用户对象,该对象将恢复为req.user
。这是一个例子:
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});