Passport not redirecting after authorization
node.js, passport-local, passport.js
Solution
I figured out my problem. The problem lied within my local strategy and my `validPassword` prototype.
Within my strategy I had a `console.log` saying error, invalid username or error, invalid password. I also had a `console.log` in my `prototype` printing the evaluation of `passwordHash.verify(unhashedPassword, this.password)`.
When I posted to login the console would print as follows:
LOG: valid username (Strategy)
LOG: invalid password (Strategy)
LOG: true (Prototype)
following the flow of logic, `LOG: true (prototype)` should appear before `LOG: invalid password (Strategy)` but it was appearing after which means there was a problem with sync somewhere.
Well, I fixed the problem by removing about 15 lines of code and now it works like a beaut.
This is what my auth strategy looks like now.
User.prototype.validPassword
User.prototype.validPassword = function(unhashedPassword) {
return passwordHash.verify(unhashedPassword, this.password);
};
LocalStrategy
passport.use(new LocalStrategy({
usernameField: 'username',
passwordField: 'password'
},
function(username, password, done) {
var unhashedPassword = password;
var passedUsername = username;
process.nextTick(function () {
User.findOne({ username: passedUsername }, function(err, user) {
console.log('within local strategy', user);
if (err) {
console.log('Error:', err);
return done(err);
}
if (!user) {
console.log('Incorrect username:');
return done(null, false, { message: 'Incorrect username.' });
}
if (!user.validPassword(unhashedPassword)) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user);
});
});
}
));
POST Login
app.post('/login',
passport.authenticate('local', { failureRedirect: '/login' }),
function(req, res) {
res.redirect('/');
});
Problem
I am running into a problem where when I try to login using passport, the page does not redirect. The authorization return `true` (correct username, password). I'm pretty sure it lies somewhere within my `validPassword` function but i'm not sure exactly. Login Route ``` app.get('/login', function (req, res) { res.render('login', {}); }); ``` Login Post ``` app.post('/login', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' })); ``` User Prototype ``` User.prototype.validPassword = function(username, unhashedPassword) { async.waterfall([ function (callback) { User.find({ "username" : username }, function (err, data) { if(err) return handleError(err); callback(null, data); }); }, function (data, callback) { var isGood = passwordHash.verify(unhashedPassword, data[0].password); callback(null, isGood); } ], function (err, result) { return result; }); }; ``` Local Strategy ``` passport.use(new LocalStrategy( function(username, password, done) { var unhashedPassword = password; var passedUsername = username; User.findOne({ username: username }, function(err, user) { if (err) { return done(err); } if (!user) { return done(null, false, { message: 'Incorrect username.' }); } if (!user.validPassword(passedUsername, unhashedPassword)) { return done(null, false, { message: 'Incorrect password.' }); } return done(null, user); }); } )); ``` There are no errors being printed out to my console so I'm slightly baffled right now. Is the `isGood` being returned in the wrong format maybe? Any help would be great.