Javascript 使用passport.js进行身份验证是否与语法混淆?
passport.js中有一些东西我不明白 一,Javascript 使用passport.js进行身份验证是否与语法混淆?,javascript,node.js,express,passport.js,Javascript,Node.js,Express,Passport.js,passport.js中有一些东西我不明白 一, var passport=require('passport')) ,LocalStrategy=require('passport-local')。策略; passport.use(新本地策略)( 函数(用户名、密码、完成){ findOne({username:username},函数(err,User){ if(err){返回完成(err);} 如果(!用户){ 返回完成(null,false,{消息:“用户名不正确”。}); } 如果(
var passport=require('passport'))
,LocalStrategy=require('passport-local')。策略;
passport.use(新本地策略)(
函数(用户名、密码、完成){
findOne({username:username},函数(err,User){
if(err){返回完成(err);}
如果(!用户){
返回完成(null,false,{消息:“用户名不正确”。});
}
如果(!user.validPassword(密码)){
返回完成(null,false,{消息:“密码不正确”。});
}
返回完成(空,用户);
});
}
));代码>
null在done()函数中表示什么。它似乎总是第一个参数,我对它的实际功能感到困惑
- cb中的null参数又是什么(null,用户)李>
按照惯例,NodeJS使用错误优先回调,这意味着回调函数的第一个参数始终是错误对象。如果没有任何错误,请传入null
。换句话说,如果错误参数为null
,则操作成功;如果错误参数不是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有认证流程的约定,如其文档所述:
如果凭据有效,验证回调将调用done
,向经过身份验证的用户提供Passport。如果凭据无效(例如,如果密码不正确),则应使用false调用done
,而不是用户,以指示身份验证失败
这就是你在这里所做的:
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.' });
}
// ...
序列化和反序列化的作用是什么?当会话存储在浏览器中时,是否在登录后调用serialize?反序列化是指访问某个页面,以便在服务器上对会话进行反序列化以验证该用户
护照上的文件说:
如果身份验证成功,将通过用户浏览器中的cookie集建立和维护会话。每个后续请求将不包含凭据,而是标识会话的唯一cookie。为了支持登录会话,Passport将序列化和反序列化会话中的用户实例
这意味着,在用户登录后,将调用serializeUser
,并将用户数据传递给回调cb
:
passport.serializeUser(function(user, cb) {
cb(null, user); // <-- this user object
});
这里要做的是将实际的user
对象传递给serializeUser
中的回调,然后通过反序列化user
中的回调将同一对象传递回。这意味着您要将整个用户对象存储在cookie中,这是一个不错的选择,但通常不是一个好主意,因为cookie存储是有限的,而且用户信息通常是敏感的
执行此操作的典型方法是将用户id(而不是整个用户对象)传递到serializeUser
中的cb
,以保持会话中存储的数据量较小。当进一步请求发生时,此id被传递给反序列化用户
,并用于查找实际的用户对象,通常从数据库中查找,该对象将被还原为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);
});
});
nodejs中有一个约定,在回调的第一个参数中传递任何错误。您将在几乎每个节点库中看到这一点,包括内置模块,如fs
。因此,传递null
就像在将结果提供给回调函数之前说函数内部没有发生错误一样。
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});