Nodejs et PassportJs: Rediriger middleware après passeport.authentifier n'est pas appelée si l'authentification échoue

Je n'ai pas de page de connexion mais plutôt j'ai un formulaire de connexion qui s'affiche sur chaque page. Je veux rediriger l'utilisateur vers la même page, ils étaient sur indépendamment de si l'authentification a réussi (avec les messages flash)

Prendre le code suivant:

app.post('/login', validateLogin, passport.authenticate('local-login'), function(req, res) {

    var redirectUrl = '/'; 

    if(req.body.to.length > 0){
        redirectUrl = req.body.to;  
    }

    console.log("THIS IS ONLY CALLED IF passport.authenticate() IS SUCCESSFUL");
    res.redirect(redirectUrl);
});

Je ne vois que la dernière middleware avant d'être appelé si l'authentification est passé. Si elle échoue, alors passeport semble être rediriger m' /login sous la forme d'une requête get. Dans mon application de cette page n'existe pas.

Si je passe une des options supplémentaires de l'objet en tant que paramètre dans le passeport fonction authentification puis cela fonctionne:

app.post('/login', validateLogin, passport.authenticate('local-login', {

successRedirect : '/', //redirect to the secure profile section
    failureRedirect : '/signup', //redirect back to the signup page. THIS IS JUST FOR TESTING TO SEE IF THE REDIRECT ON FAIL WORKS.
    failureFlash : true, //allow flash messages

}


));

Mais ce faisant, je perds la possibilité de choisir où rediriger l'utilisateur. Il semble que le passeport prend le contrôle sur l'endroit où l'utilisateur est redirigé vers si l'authentification échoue. Comment puis-je résoudre ce problème? Ou est-ce un bug? Doit passeport authentifier être la dernière middleware dans la chaîne si l'authentification échoue?

C'est ma stratégie locale appel de la fonction:

//LOCAL LOGIN

passport.use('local-login', new LocalStrategy({ 
    //by default, local strategy uses username and password, we will override with email
    usernameField : 'email',
    passwordField : 'password',
    passReqToCallback : true //allows us to pass back the entire request to the callback
},
function(req, email, password, done) { //callback with email and password from our form


    console.log("IN PASSPORT");

   if(email.length == 0 || password.length == 0){

       console.log("FIELDS ARE EMPTY"); 
      return done(null, false, req.flash('loginMessage', 'Fill in all values.'));

   }

    //find a user whose email is the same as the forms email
    //we are checking to see if the user trying to login already exists
    User.findOne({ 'local.email' :  email }, function(err, user) {
        //if there are any errors, return the error before anything else



        if (err){
            return done(err);
        console.log("db err");
        }
        //if no user is found, return the message
        if (!user){
            console.log("not user");
            return done(null, false, req.flash('loginMessage', 'Incorrect details.')); //req.flash is the way to set flashdata using connect-flash
        }    
        //if the user is found but the password is wrong

        if (!user.validPassword(password)){
            console.log("invalid pw");
            return done(null, false, req.flash('loginMessage', 'Incorrect details.')); //create the loginMessage and save it to session as flashdata
        }    
        //all is well, return successful user
        console.log("All OK");
        return done(null, user);
    });

}));

OriginalL'auteur Paulie | 2014-04-04