2017-06-24 2 views
0

Ich habe stackoverflow aus Gründen gesucht, warum meine node.js (express) -App hängt an einigen Posts mit pass.js.passport.js hängt an einigen Posts

Ich habe bei diesem Fall entweder zwei Fragen suchen:

More Passport.js woes - hangs on form submission

Passport (local) is hanging on Authentication

Mein Code ein Benutzer für die Erstellung funktioniert gut, und sieht wie folgt aus:

passport.use('local-signup', 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 in the req from our route (lets us check if a user is logged in or not) 
    }, 
    function(req, email, password, done) { 
     if (email) 
      email = email.toLowerCase(); // Use lower-case e-mails to avoid case-sensitive e-mail matching 

     // asynchronous 
     process.nextTick(function() { 
      // if the user is not already logged in: 
      if (!req.user) { 

       User.findOne({ 
        where: { 
         local_email: email 
        } 
       }).then(function(user) { 
        if (user){ 
         return done(null, false, req.flash('signupMessage', 'That email is already taken.')); 
        }else{ 
         // create the user 
         User 
       .build({ 
        local_email: email, 
           local_password: generateHash(password), 
           id: 1 //Normal activated user 
       }) 
       .save() 
       .then(newUser => { 
       //Our newly crated user 
       return done(null, newUser); 
       }) 
       .catch(error =>{ 
       //Woops something went wrong 
       return done(error); 
       }) 

         //var newUser   = new User(); 
         //newUser.localemail = email; 
         //newUser.localpassword = generateHash(password); 

         //User.create(newUser).then(function(newUser, created) { 
         // if (!newUser) { 
         //  return done(err); 
         // } 
         // if (newUser) { 
         //  return done(null, newUser); 
         // } 
         //}); 
        } 
       }); 
       // if the user is logged in but has no local account... 
      } else if (!req.user.local.email) { 
       // ...presumably they're trying to connect a local account 
       // BUT let's check if the email used to connect a local account is being used by another user 
       User.findOne({ 
        where: { 
         localemail: email 
        } 
       }).then(function(user) { 
        if (err) 
         return done(err); 
        if (user){ 
         return done(null, false, req.flash('loginMessage', 'That email is already taken.')); 
         // Using 'loginMessage instead of signupMessage because it's used by /connect/local' 
        } else { 
         // create the user 
         var newUser   = new User(); 

         newUser.local.email = email; 
         newUser.local.password = generateHash(password); 
         User.create(newUser).then(function(newUser, created) { 
          if (!newUser) { 
           return done(err); 
          } 
          if (newUser) { 
           return done(null, newUser); 
          } 
         }); 
        } 
       }); 
      } else { 
       // user is logged in and already has a local account. Ignore signup. (You should log out before trying to create a new account, user!) 
       return done(null, req.user); 
      } 
     }); 
    })); 

In meine routers datei den post zu dieser funktion sieht so aus:

// process the signup form 
app.post('/signup', passport.authenticate('local-signup', { 
    successRedirect : '/profile', // redirect to the secure profile section 
    failureRedirect : '/signup', // redirect back to the signup page if there is an error 
    failureFlash : true // allow flash messages 
})); 

Mein Code für die Anmeldung funktioniert aber nicht so gut. Die Funktion in passport.js sieht wie folgt aus:

// process the login form 
app.post('/login', passport.authenticate('local-login', { 
    successRedirect : '/', // redirect to the secure profile section 
    failureRedirect : '/login', // redirect back to the signup page if there is an error 
    failureFlash : true // allow flash messages 
})); 

Der obige Code hängt, wenn das Formular abgeschickt wird:

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 in the req from our route (lets us check if a user is logged in or not) 
    }, 
    function(req, email, password, done) { 
     if (email) 
      email = email.toLowerCase(); // Use lower-case e-mails to avoid case-sensitive e-mail matching 

     // asynchronous 
     process.nextTick(function() { 
      User.findOne({ 
       where: { 
        local_email: email 
       } 
      }).then(function(user){ 
     console.log("TEST: "+user); 
       // if no user is found, return the message 
       if (!user){ 
     console.log("no user with the following email: " +email); 
        return done(null, false, req.flash('loginMessage', 'No user found.')); 
       }else if(!validPassword(password,user.local_password)){ 
        console.log("wrong password"); 
     return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); 
       // all is well, return user 
       }else{ 
        return done(null, user); 
     return; 
      } 
      }).catch(function(err){ 
     console.log("woops der skete en fejl: "+err); 
     console.log("email is: "+email); 
       console.log("password is: "+password); 
     return done(err); 
    }); 

     }); 

    })); 

Die entsprechende Route wie folgt aussieht. Wenn ich den Code ändert:

app.post('/login', function(req, res, next) { 
    passport.authenticate('local-login', function(err, user, info) { 
     if (err) { return next(err); } 
     if (!user) { 
     return res.render('/login', { 
      pageTitle: 'Sign in', 
      form: req.body 
     }); 
     } 
     req.logIn(user, function(err) { 
     if (err) { return next(err); } 
     return res.redirect('/'); 
     }); 
    })(req, res, next); 
}); 

Ich erhalte eine 500 Irgendwelche Ideen, warum dies isen't zu arbeiten?

mit Konsolenausgabe aktualisiert:

Executing (default): SELECT `id`, `role`, `local_email`, `local_password`, `facebook_id`, `facebook_token`, `facebook_email`, `facebook_name`, `twitter_id`, `twitter_token`, `twitter_displayname`, `twitter_username`, `google_id`, `google_token`, `google_email`, `google_name`, `createdAt`, `updatedAt` FROM `users` AS `users` WHERE `users`.`local_email` = '[email protected]' LIMIT 1; 
TEST: [object SequelizeInstance:users] 
POST /login 302 87.021 ms - 46 
Executing (default): SELECT `id`, `role`, `local_email`, `local_password`, `facebook_id`, `facebook_token`, `facebook_email`, `facebook_name`, `twitter_id`, `twitter_token`, `twitter_displayname`, `twitter_username`, `google_id`, `google_token`, `google_email`, `google_name`, `createdAt`, `updatedAt` FROM `users` AS `users` WHERE `users`.`id` = 1; 

mit geänderten passport.deserializeUser

Aktualisiert
passport.deserializeUser(function(id, done) { 
     /*User.findById(id, function(err, user) { 
      done(err, user); 
     });*/ 
     User.findById(id).then(user => { 
      if (!user){ 
       done(null); 
      }else{ 
       done(user); 
      } 
     }) 
    }); 
+0

Sie alle möglichen Dinge Anmeldung, wo genau ist das Logging stoppen? Sind Sie sicher, dass eine gültige Datenbankverbindung besteht? – robertklep

+0

Ich habe den Beitrag mit der Konsolenausgabe aktualisiert. Ich bin ziemlich sicher, dass ich Datenbankverbindung habe, weil ich Benutzer erstellen kann und die Konsolenausgabe die ausführende Abfrage anzeigt? – Tony

+0

Es sieht so aus, als ob das Problem in Ihrem '/' Handler (oder möglicherweise, passag.deserializeUser') liegt, da der 'POST/login' die Umleitung auszugeben scheint. Rufen Sie 'POST/login' mit XHR/AJAX/fetch auf (d. H. Über Code und nicht über ein Formular)? – robertklep

Antwort

0

Ihre passport.deserializeUser nicht korrekt ist. Wie bei allen Node.js-Callbacks ist das erste Argument für Fehler reserviert und sollte null (oder ein anderer falscher Wert) sein, wenn keine Fehler vorliegen. In Ihrem Fall übergeben Sie user als erstes Argument, wodurch Passport denkt, dass ein Fehler aufgetreten ist.

Try this:

passport.deserializeUser(function(id, done) { 
    User.findById(id) 
     .then(user => done(null, user)) 
     .catch(done); 
}); 
+0

Vielen Dank, das war genau das Problem. Nochmals sehr detailliert und freundlich helfen das Loch weg;) – Tony