2016-06-14 39 views
0

我有一個Express護照本地策略的應用程序,使用Mongoose存儲用戶帳戶。我有一位自由撰稿人爲我編寫應用程序的這部分內容,因爲我無法理解如何從頭到尾構建登錄系統(我發現每個教程都以不同的方式進行)。這樣做的缺點是我不明白每個部件的作用。這是我app.js文件:檢查用戶是否存在護照本地

const Account = require('./models/db/AccountsSchema'); 

app.use(passport.initialize()); 
app.use(passport.session()); 

passport.use(new LocalStrategy(Account.authenticate())); 
passport.serializeUser(Account.serializeUser()); 
passport.deserializeUser(Account.deserializeUser()); 

,這是routes/index.js

router.post('/register', function(req, res) { 
    Account.register(new Account({ 
     username: req.body.username, 
     name: req.body.name 
    }), req.body.password, function(err, account) { 
     if (err) { 
      console.log(err); 
     } else { 
      console.log(account); 
      passport.authenticate('local', { 
       successRedirect: '/', 
       failureRedirect: '/login' 
      })(req, res, function(err, user) { 
       res.redirect('/'); 
      }); 
     } 
    }); 
}); 

連同:

router.post('/login', 
    passport.authenticate('local'), 
    function(req, res) { 
     res.redirect('/'); 
    } 
); 

現在在登錄POST請求,我想有一個檢查是否存在具有該特定用戶名的用戶,以便如果密碼錯誤,至少我可以告訴用戶密碼錯誤。用戶枚舉在這裏不是安全問題。

在我的代碼中,我可以合併數據庫檢查是否存在具有指定用戶名的帳戶?

回答

0

Account.authenticate()功能。因爲它在你的情況下設置LocalStrategy。

設置本地策略:

passport.use(new LocalStrategy(Account.authenticate())); 

示例代碼:

function authenticate(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); 
    }); 
    } 
+0

我沒有看到user.validPassword()從何而來。那是一個passport.js函數嗎? – Ric

+0

@Ric不是它不是passport.js函數,而是在貓鼬模式中定義的自定義模型函數。 – Nivesh