2014-01-12 61 views
2

我在做什麼錯?它總是重定向到失敗頁面,但我無法調試。PassportJS not authenticate

// passport 
var passport = require('passport'), 
    LocalStrategy = require('passport-local').Strategy, 
    User = require('./models/user.js').Model; 

passport.use(new LocalStrategy({ 
    usernameField: 'email', 
    passwordField: 'password' 
    }, 
    function(username, password, done) { 
    User.findOne({ username: username }, function(err, user) { 
     console.log('entrou'); 
     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); 
    }); 
    } 
)); 


// login 
app.get('/login', user.login); 
app.post('/login', 
    passport.authenticate('local', { 
    successRedirect: '/', 
    failureRedirect: '/login' 
    }) 
); 
+0

findOne是如何實現的? – user568109

+0

另外,在登錄後('console.log'),'err'和'user'是否包含期望值?您是否實施了'passport.serializeUser'和'passport.deserializeUser',以及Passport的所有其他要求? – robertklep

+0

我有類似的問題,調試顯示(!user.validPassword)在內部方法將其設置爲true之前返回false。 (幾乎就像它是在一個異步方法中執行,但它是同步的權利?) - 編輯:我想出來了,bcrypt在我的auth函數內觸發一個異步方法 - 所以在它有機會評估來自bcrypt的響應。 –

回答

2

我也有一些問題與passport.js不認證。所以在這裏它是如何工作對我來說:

/** 
* Local authentication strategy 
* 
*/ 
passport.use('local', new LocalStrategy(function(username, password, done) { 
    //async code waits until next() 
    process.nextTick(function() { 
    //searches the database for the user 
    //that matches the username|e-mail and password provided 
    models.User.checkCredentials(username, password, function(err, user) { 
     if (err) { 
     return done(err); 
     } 

     //user is not found 
     if (!user) { 
     return done(null, false, {message: 'Unknown user ' + username}); 
     } 

     return done(null, user); 
    }); 
    }); 
})); 

登錄用戶

app.post('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { return next(err); } 
    // if user is not found due to wrong username or password 
    if (!user) { 
     return res.render('login', { 
     //you can send a message to your view 
     message: 'Invalid username or password' 
     }); 
    } 
    //passport.js has a logIn user method 
    req.logIn(user, function(err) { 
     if (err) { return next(err); } 

     return res.redirect('/'); 
    }); 
    })(req, res, next); 
}); 
+1

我的表單中的字段名稱錯誤。 Noob錯誤。 –