Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用passport.js进行身份验证是否与语法混淆?_Javascript_Node.js_Express_Passport.js - Fatal编程技术网

Javascript 使用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,{消息:“用户名不正确”。}); } 如果(

passport.js中有一些东西我不明白

一,

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);
      });
    });