2013-07-30 7 views
12

Ich versuche, einen Benutzer sofort nach dem Abschicken eines POST auf dem /register Formular zu authentifizieren und einzuloggen. Im Idealfall möchte ich, dass Benutzer sich registrieren können und dann sofort zum Dashboard weitergeleitet werden, ohne ihre Anmeldeinformationen erneut eingeben zu müssen.Passport-Authentifizierung sofort nach Neu-Benutzerregistrierung

Mein Server verwendet Passport 0.1.17 mit der lokalen Strategie, die für die Verwendung der E-Mail-Adresse und des Kennworts für die Anmeldung konfiguriert ist. Der aktuelle Code ist:

app.post('/register', function(req, res) { 

    // attach POST to new User variable 
    var registerUser = new User({ email: req.body.email, password: req.body.password, name: req.body.name }); 

    // save registerUser Mongo 
    registerUser.save(function(err) { 
    if(err) { 
     console.log(err); 
    } else { 
     console.log('registerUser: ' + registerUser.email + " saved."); 
    } 
    }); 

    // here is where I am trying to authenticate and then redirect 
    passport.authenticate('local', { failureRedirect: '/login', failureFlash: true }), 
    res.redirect('/dashboard'); 
    }); 

Wie würde ich diesen Code Refactoring den neuen Benutzer zu speichern, dann authentifizieren und schließlich auf dem Armaturenbrett umleiten?

Vielen Dank im Voraus!

+2

Verwenden Sie 'req.logIn' Methode zur Authentifizierung direkt nach der Registrierung. – moka

+0

Danke für die Referenzierung von 'req.logIn', was mir vorher nicht bewusst war. Können Sie spezifischeren Code bereitstellen? Ich habe folgendes nach dem letzten Kommentar in der obigen Frage versucht, aber es hat nicht funktioniert: 'req.login (registerUser, function (err) { if (err) {zurück next (err);} return res.redirect ('/ dashboard'); }); ' – surfearth

+0

Sie müssen Details angeben, die zum Deserialisieren des Benutzers verwendet werden, normalerweise ist dies die ID eines Benutzers, der in einer Sitzung gespeichert ist. – moka

Antwort

19

Hier ist die Lösung kam ich mit nach etwa req.login Lesen:

app.post('/register', function(req, res) { 
    // attach POST to user schema 
    var user = new User({ email: req.body.email, password: req.body.password, name: req.body.name }); 
    // save in Mongo 
    user.save(function(err) { 
    if(err) { 
     console.log(err); 
    } else { 
     console.log('user: ' + user.email + " saved."); 
     req.login(user, function(err) { 
     if (err) { 
      console.log(err); 
     } 
     return res.redirect('/dashboard'); 
     }); 
    } 
    }); 
}); 

Ich mag wäre es ein wenig aufzuräumen und denken, dass die err Abschnitt robuster sein könnte, aber das ist eine funktionierende Lösung. Beachten Sie, dass dies von jemand anderem implementiert wird. Sie sollten sich bewusst sein, dass sie auf die Verwendung der Passport-lokalen Strategie mit E-Mail anstelle von Nutzernamen zugeschnitten ist.

+1

Frage von einem Neuling: Bedeutet das, dass Sie das Passwort des Benutzers als einfachen Text in Ihrer Datenbank speichern? Wenn also jemand Ihre Datenbank bekommt, kann er das Passwort Ihres Benutzers lesen? –

+2

@Paul D. White: Ich weiß, dass dies alt ist, aber um Ihre Frage für zukünftige Leser zu beantworten, ist es üblich, die Verschlüsselung innerhalb der Benutzermodellklasse selbst so zu handhaben, dass sie für den Rest der Anwendung transparent ist (was den Vorteil hat, es unvermeidbar zu machen). – Matt

+0

@Matt: schön, Prost Prost. –

Verwandte Themen