2016-07-15 8 views
1

Ich erstelle eine Anwendung, die Knoten verwendet, der Passport.js verwendet, um Benutzeranmeldung unter Verwendung einer lokalen Datenbank zu verarbeiten.Node.js Passport, der die nächste Funktion nicht aufruft

So habe ich den folgenden Code, der aufgerufen wird, wenn ein Benutzer zu/Profil geht. Nach erfolgreicher Anmeldung wird der Benutzer nach/profile weitergeleitet. Was nach morgan geschieht.

app.get('/profile', passport.authenticate('local-login', { session : false, failureRedirect : '/login' }), function(req, res) { 
    console.log("testnow"); 
    res.render('profile.ejs', { 
     user : req.user // get the user out of session and pass to template 
    }); 
}); 

Mein lokaler Login-Code ist der folgende.

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 
    // 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); 

     // if no user is found, return the message 
     if (!user) 
      return done(null, false, req.flash('loginMessage', 'No user found.')); // 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)) 
      return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); // create the loginMessage and save it to session as flashdata 

     // all is well, return successful user 
     console.log("testdone"); 
     return done(null, user); 
    }); 
})); 

Beim Testen des Codes logge ich mich ein und werde für einen Bruchteil einer Sekunde zum Profil weitergeleitet. Die Konsole druckt "testdone", was in meinem lokalen Login-Code ist, aber "testnow" nicht wie erwartet druckt. Das heißt, die zweite Funktion in meiner/profile get-Methode scheint nie aufgerufen zu werden, selbst wenn die lokale Anmeldung die nächste Funktion aufruft.

Also von den Endbenutzern Standpunkt loggen Sie sich ein (hinter den Kulissen werden Sie umgeleitet/Profil für einen Split-Bereich) und/Profil leitet Sie zurück zu/Login.

Irgendwelche Ideen, wie dies zu beheben, so dass die zweite Funktion in meinem/Profil get-Methode tatsächlich aufgerufen wird?

Vielen Dank im Voraus. Ich wäre auch gerne bereit, Ihnen zusätzliche Informationen zur Verfügung zu stellen.

+0

Versuchen Sie, ein Attribut zum options-Objekt am pasport.authenticate hinzuzufügen: 'successRedirect: '/ profile'und erstellen Sie eine Route/Profil im Erfolgsfall, ich weiß nicht, ob der Pass die nächste Funktion nach Ihnen anruft 'authentifizieren auslassen successfulRedirect –

+0

@FernandoZamperin Hinzufügen eines Erfolgs Redirect/Profil wird eine Endlosschleife zu korrigieren? –

+0

Sorry ich missverstanden !!! Versuchen Sie, zu einem anderen Weg successRedirect nur für Testzwecke, um zu sehen, ob das Problem ist, dass Pass nicht als nächstes ruft –

Antwort

1

passport.authenticate() ist für die eigentliche Authentifizierung gedacht; mit anderen Worten, um die Anmeldeinformationen zu übernehmen und sie an die Strategie zu übergeben. Es ist nicht dazu gedacht, Anfragen weiterzuleiten, wenn sie bereits authentifiziert sind, wofür Sie es verwenden möchten.

Stattdessen wollen Sie so etwas wie connect-ensure-login verwenden Routen zu schützen, für die ein Benutzer angemeldet werden muss.

Siehe auch this Passport example project.

+0

Ok cool. So ziemlich muss ich meine Richtung ändern. Vielen Dank. –

Verwandte Themen