Non ho una pagina di accesso, ma ho un modulo di accesso che appare su ogni pagina. Voglio riorientare utente alla stessa pagina che erano sulla indipendentemente dal fatto che l'autenticazione ha avuto successo (con opportuni messaggi flash)Nodejs e PassportJs: reindirizza il middleware dopo che passport.authenticate non viene chiamato se l'autenticazione fallisce
Prendere il seguente codice:
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);
});
vedo solo il middleware finale sopra essere chiamato se l'autenticazione è passata. Se fallisce, sembra che il passaporto mi stia reindirizzando a/login sotto forma di richiesta get. Nella mia app questa pagina non esiste.
Se mi passa un ulteriore opzioni oggetto come un parametro nella funzione passaporto autenticazione allora questo funziona:
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
}
));
Ma nel fare questo ho perdere la capacità di scegliere dove reindirizzare l'utente a. Sembra che il passaporto abbia il controllo su dove viene reindirizzato l'utente se l'autenticazione fallisce. Come posso risolvere questo? o è un bug? Il passaporto deve autenticare l'ultimo middleware della catena se l'autenticazione fallisce?
Questo è il mio locale chiamata di funzione strategia:
//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);
});
}));
Questo funziona. Grazie. (Nota per auto ... leggi sempre il manuale). – Paulie
In tua difesa, è un manuale piuttosto conciso per un concetto grande. (incontrando problemi simili io stesso ...) –
Abbiamo bisogno di includere "strategia locale" per questo? Nel mio caso mi sta dando errore di strategia locale sconosciuta. – adi