2013-05-29 14 views
23

Sto utilizzando il passaporto per l'autenticazione e la gestione delle sessioni. Tutto funziona bene finora. Ho implementato un modulo "Accedi" per aggiungere nuovi utenti all'app. Dopo aver aggiunto un utente, desidero collegarlo automaticamente.Passport + Node.js/Accesso automatico dopo l'aggiunta dell'utente

Qual è il modo migliore per ottenere questo - devo reindirizzare a "/ login" con le credenziali dell'utente o c'è un altro/modo migliore (chiamare serializeUser) per farlo?

Finora penso che non ho capito davvero il modo in cui la funzione di "fatto" (in serializeUser e LocalStrategy) sta lavorando o che cosa sta facendo ...

Ecco il mio codice:

passport.serializeUser(function(user, done) { 
    done(null, user._id); 
}); 
passport.deserializeUser(function(id, done) { 
    authProvider.findUserById('users', id, function (err, user) { 
     done(err, user); 
    }); 
}); 

passport.use(new LocalStrategy(function(email, password, done) { 
    authProvider.getUserByEmail('users', email, function(error, user){ 
     if(error) { return done(error); } 
     if (!user) { return done(null, false, { message: 'Unknown user ' + email });} 
     if (user.password != password) { return done(null, false);} 
     return done(null, user); 
     }); 
    } 
)); 

app.post('/login', 
    passport.authenticate('local', { failureRedirect: '/login'}), 
    function(req, res) { res.redirect('/');}); 

app.post('/sign', function(req, res){ 
    authProvider.saveUser(...do stuff), function(error, user){ 
     if(error){ 
      res.redirect('/sign'); 
     } else { 
      res.redirect('/'); 
     } 
    }); 
}); 

Qualcuno sa come fare questo?

+0

Perché avrebbe la funzione deserialize accesso DB? Non può semplicemente tornare fatto (null, id); ? – Se7enDays

risposta

10

Si prega di utilizzare il codice da the @Weston answer bellow, perché è più universale e diretto

dovrebbe essere simile a questo

app.post('/sign', function(req, res){ 
    authProvider.saveUser(...do stuff), function(error, user){ 
     if(error){ 
      res.redirect('/sign'); 
     } else { 
      passport.authenticate('local')(req, res, function() { 
       res.redirect('/account'); 
      }) 
     } 
    }); 
});   

Io non sicuro circa il nome della strategia, ma probabilmente la LocalStrategy dovrebbe fornire il nome "locale"

http://passportjs.org/guide/authenticate/

+0

Grazie per la risposta, ma non funziona. Ottengo "Non autorizzato". – user937284

+1

Ecco l'esempio funzionante: https://gist.github.com/krasu/5688235, assicurati che i nomi dei campi nel modulo di registrazione corrispondano al modulo di login – krasu

+0

Il campo di posta elettronica deve essere denominato nomeutente - il gioco è fatto. Grazie! – user937284

32

In base allo Passport Guidereq.login() è inteso per questo scopo esatto.

Questa funzione viene utilizzata principalmente quando gli utenti si iscrivono, durante il quale req.login() può essere invocato per accedere automaticamente l'utente appena registrato. Codice

Modifica del Carso:

app.post('/sign', function(req, res){ 
    authProvider.saveUser(...do stuff), function(error, user){ 
     if (error){ 
      res.redirect('/sign'); 
     } else { 
      req.login(user, function (err) { 
       if (! err){ 
        res.redirect('/account'); 
       } else { 
        //handle error 
       } 
      }) 
     } 
    }); 
}); 

L'errore potenziale dal login() richiamata sarebbe venuto dalla vostra funzione serializeUser().

+1

In base al tuo link, il nome del metodo è 'login', non' logIn'. – fiddur

+2

'logIn' era la vecchia API, è ancora un alias accettato e segue la convenzione di libreria sull'intelaiatura del cammello (a seconda se si vede il log-in come una o due parole). Siete più che benvenuti ad aggiornare la risposta per la nuova API con un buon riassunto delle modifiche, soprattutto data l'età della risposta. – Weston

+0

E se effettuo l'accesso direttamente? Devo esplicitamente chiamare la funzione req.login? –

1

Prova con:

app.post('/sign', function(req, res){ 
    authProvider.saveUser(...do stuff), function(error, user){ 
     passport.authenticate('local', (err, user) => { 
      req.logIn(user, (errLogIn) => { 
       if (errLogIn) { 
        return next(errLogIn); 
       } 
       return res.redirect('/account'); 
      }); 
     })(req, res, next); 
    }); 
}); 
+1

Sì, ho letteralmente sprecato molte ore per capire cosa è andato sbagliato, quando noto dal tuo codice che ho dimenticato di passare '(req, res, next)' a 'passport.authenticate()'. –

Problemi correlati