2017-02-24 87 views
0

我正在学习Node.s和Express,我正在从https://github.com/EvanHahn/Express.js-in-Action-code/tree/master/Chapter_08/learn-about-me以下示例。你能解释下面的问题吗?使用Express的节点护照流程

  1. 在“/登录”后的路线,如果我需要访问请求和响应对象,我应该怎么办呢?
  2. 什么是LocalStrategy()中的“done”函数,以及我如何知道要传递哪个参数?看起来它需要3个参数,第二个参数是用户对象,第三个参数是消息。第一个参数是什么?
  3. 如何将用户名和密码从“/ login”后路由传递到LocalStrategy?幕后有什么魔力?
router.post("/login", passport.authenticate("login", { 
    successRedirect: "/", 
    failureRedirect: "/login", 
    failureFlash: true 
})); 
passport.use("login", 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: "No user has that username!" }); 
     } 
     user.checkPassword(password, function(err, isMatch) { 
     if (err) { return done(err); } 
     if (isMatch) { 
      return done(null, user); 
     } else { 
      return done(null, false, { message: "Invalid password." }); 
     } 
     }); 
    }); 
    })); 

回答

1

的问题#1和#2的答案是http://passportjs.org/docs

app.get('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { return next(err); } 
    if (!user) { return res.redirect('/login'); } 
    req.logIn(user, function(err) { 
     if (err) { return next(err); } 
     return res.redirect('/users/' + user.username); 
    }); 
    })(req, res, next); 
}); 

3是在同一个文档页面。

passport.use(new LocalStrategy({ 
    usernameField: 'email', 
    passwordField: 'passwd' 
    }, 
    function(username, password, done) { 
    // ... 
    } 
));