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
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser une authentification personnalisée de rappel, comme décrit dans le dernier paragraphe, il y http://passportjs.org/guide/authenticate/.
Dans votre défense, c'est plutôt laconique manuel pour un grand concept. (à venir à travers des problèmes similaires de moi-même...)
Devons-nous inclure la "stratégie locale" pour qui? Dans mon cas sa me donne erreur inconnue de la stratégie locale.
OriginalL'auteur ploutch
J'ai été en cours d'exécution dans la même question, où la redirection des appels , qui suivent succès de Facebook Auth
.. n'ont pas été mis à l'honneur.
Basée sur le "local" passportJS de la Stratégie - et un joli rappel de @ploutch de réponse ici .. j'ai réalisé la clé pour la faire fonctionner semble être dans le présent appel:
Pour Facebook, cette route de l'installation a fonctionné pour moi:
J'ai trouvé ce type de structure très délicat/confus moi-même, ne suis pas du tout un fan de alambiqué authentification des constructions .. grumble, grognent. Pour la solution ici - la qualification des mots-clés sont "cette route de l'installation a fonctionné pour moi" 🙂
OriginalL'auteur Gene Bo
Réponse complète, y compris:
Il suffit de créer un
redirectTo
valeur dans votreloginRequired
middleware:Et puis dans votre login POSTE:
Yep Tim c'est une description précise. Peut-être
.next()
est plus idiomatique? Qu'en pensez-vous? Vous êtes les bienvenus pour modifier le poste tant que le code fonctionne!OriginalL'auteur mikemaccana