Nie mam strony logowania, ale mam formularz logowania, który pojawia się na każdej stronie. Chcę przekierować użytkownika z powrotem do tej samej strony byli na, niezależnie od tego, czy autoryzacja przebiegła pomyślnie (z odpowiednich komunikatów flash)Nodejs i PassportJs: Przekieruj oprogramowanie pośrednie po tym, jak paszport.authenticate nie zostanie wywołany, jeśli uwierzytelnienie się nie powiedzie
Weźmy następujący kod:
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);
});
widzę tylko ostateczną middleware powyżej miano jeśli uwierzytelnienie zostanie przekazane. Jeśli się nie uda, wydaje się, że paszport przekierowuje mnie do/login w formie żądania pobrania. W mojej aplikacji ta strona nie istnieje.
Gdybym przekazać dodatkowe opcje obiekt jako parametr w funkcji paszport uwierzytelniać wtedy to działa:
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
}
));
Ale w ten sposób tracę możliwość wyboru, gdzie przekierować użytkownika do. Wygląda na to, że paszport przejmuje kontrolę nad miejscem przekierowania użytkownika, jeśli uwierzytelnienie nie powiedzie się. Jak mogę to naprawić? Czy to błąd? Czy uwierzytelnianie paszportowe musi być ostatnim oprogramowaniem pośredniczącym w łańcuchu, jeśli uwierzytelnienie nie powiedzie się?
To mój lokalny wywołanie funkcji 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);
});
}));
To działa. Dzięki. (Uwaga dla siebie ... zawsze czytaj w instrukcji). – Paulie
W twojej obronie, to raczej lapidarny podręcznik dla dużej koncepcji. (samemu stawiam podobne problemy ...) –
Czy musimy uwzględnić w tym celu "strategię lokalną"? W moim przypadku daje mi błąd w nieznanej strategii lokalnej. – adi