2016-04-19 8 views
0

Ich benutze pass.js, um Benutzer für mein node.js-Backend für meine App zu authentifizieren. Der folgende Code führt immer failureRedirect aus, und ich kann den Grund dafür nicht finden. Es gibt keine Fehlermeldung.Passport-Authentifizierung führt immer failureRedirect aus

router.post('/login', passport.authenticate('local', { 
                failureRedirect: '/users/login', 
                failureFlash: 'Invalid email or password' 
               }), function(req, res) { 
console.log('Authentication Successful'); 
req.flash('success', 'You are logged in '); 
res.redirect('/'); 
}); 

Ich kopierte diesen Code aus dem Pass Webseite und auch das funktioniert nicht:

router.post('/login', passport.authenticate('local', { successRedirect: '/', 
               failureRedirect: '/users/login' })); 

Der folgende Code nicht einmal beginnt:

passport.use(new localStrategy({ 
          email: 'email', 
          password: 'password' 
          }, function(email, password, done) { 
User.getUserByEmail(email, function(err, user) { 
    if (err) throw err; 
    if (!user) { 
     console.log('Unknown User'); 
     return done(null, false, { 
      message: 'Unknown User' 
     }); 
    } 

    User.comparePassword(password, user.password, function(err, isMatch) { 
     if (err) throw err; 
     if (isMatch) { 
      return done(null, user); 
     } else { 
      console.log('Invalid Password'); 
      return done(null, false, { 
       message: 'Invalid Password' 
      }); 
     } 
    }); 
}); 
})); 

Rest des entsprechenden Code:

passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 

passport.deserializeUser(function(id, done) { 
User.getUserById(id, function(err, user) { 
    done(err, user); 
}); 
}); 


module.exports.getUserByEmail = function(email, callback){ 
var query = {email: email}; 
    User.findOne(query, function(err, user) { 
    callback(err, user); 
    }); 
} 

module.exports.getUserById = function(id, callback){ 
    User.findById(id, function(err, user) { 
    callback(err, user); 
    }); 
} 

module.exports.comparePassword = function(userPassword, hash, callback){ 
    console.log("pwd: " + userPassword + " hash: " + hash); 
    bcrypt.compare(userPassword, hash, function(err, isMatch) { 
    if(err) return callback(err); 
    callback(null, isMatch); 
    }); 
} 

Antwort

1

Versuchen Sie, Ihre localStrategy-Konfiguration zu ändern this one

Der Standardname der Login-Variablen, die express verwendet, ist 'Benutzername' und 'Passwort'. Für den Fall, müssen sie geändert werden, wie es ist ‚E-Mail‘ im obigen Fall sollte der Code auf folgende Weise geändert werden:

passport.use(new localStrategy({usernameField: 'email'}, function(username, password, done){ 
    User.getUserByEmail(username, function(err, user){ 
    //rest of the code 

Ohne die Änderung der Benutzernameauszuwählen, sucht das localStrategy für ‚username‘ aber es findet es daher nicht, es leitet um. Wenn nun das usernameField geändert wird, findet es die "E-Mail" und verwendet diese anstelle des Benutzernamens, um die Authentifizierung durchzuführen.

+0

Nein, das funktioniert nicht ... keine Änderung des Fehlers PS. es gibt extra ';' in deiner Antwort – suku

+0

Meine schlechte, bearbeite ich die Antwort –

+0

Diese so dumme Sache zu tun, per Express – suku