2013-07-30 9 views
12

Próbuję uwierzytelnić użytkownika i zalogować się do niego natychmiast po przesłaniu testu POST w formularzu /register. Najlepiej byłoby, gdyby użytkownicy mogli się zarejestrować, a następnie zostać przekierowani bezpośrednio do pulpitu, bez konieczności ponownego wprowadzania swoich danych uwierzytelniających.Uwierzytelnianie paszportu natychmiast po rejestracji nowego użytkownika

Mój serwer używa usługi Passport 0.1.17 z lokalną strategią skonfigurowaną do używania adresu e-mail i hasła do logowania. Obecny kod to:

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'); 
    }); 

Jak mogę zmienić ten kod, aby zapisać nowego użytkownika, a następnie uwierzytelnić i ostatecznie przekierować na pulpit?

Z góry dziękuję!

+2

Użyj metody 'req.logIn', aby uwierzytelnić się bezpośrednio po rejestracji. – moka

+0

Dzięki za odniesienie do 'req.logIn', którego wcześniej nie zdawałem sobie sprawy. Czy możesz podać bardziej szczegółowy kod. Próbowałem następujących po ostatnim komentarzem w powyższym pytanie, ale to nie działa: 'req.login (registerUser, funkcja (err) { if (err) {return next (err);} return res.redirect ('/ dashboard'); }); ' – surfearth

+0

Musisz podać szczegóły, które są używane do deserializacji użytkownika, zwykle jest to identyfikator użytkownika, który jest przechowywany w sesji. – moka

Odpowiedz

19

Oto rozwiązanie wpadłem po przeczytaniu o req.login:

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'); 
     }); 
    } 
    }); 
}); 

chciałbym je posprzątać trochę i myślę, że sekcja err może być bardziej wytrzymałe, ale jest to rozwiązanie funkcjonowanie. Zauważ, że ktoś inny to implementuje, powinni mieć świadomość, że jest on dostosowany do korzystania z lokalnej strategii paszportowej za pomocą poczty e-mail zamiast nazwy użytkownika.

+1

Zapytanie od nowicjusza: czy to znaczy, że przechowujesz hasło użytkownika w postaci zwykłego tekstu w bazie danych? Więc jeśli ktoś dostanie twoją bazę danych, może odczytać hasło użytkownika? –

+2

@Paul D. White: Wiem, że to jest stare, ale aby odpowiedzieć na twoje pytanie z korzyścią dla przyszłych czytelników, powszechne jest posługiwanie się szyfrowaniem w obrębie samej klasy modelu użytkownika, w sposób przejrzysty dla reszty aplikacji. (co ma tę zaletę, że czyni go nieuniknionym). – Matt

+0

@Matt: ładne, okrzyki okrzyki. –