2017-02-24 73 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) { 
    // ... 
    } 
));