2013-12-17 7 views
13

Sto configurando ciò che pensavo sarebbe stata la più semplice possibile - un sito carica su uno schermo di accesso, l'utente inserisce le credenziali in un modulo, sull'invio sto usando Passport. JS e Sequelize per controllare le credenziali. La maggior parte di questo è copiata da vari tutorial o dal sito Web di Passport stesso. Non importa cosa faccio, cambio o tentativo, il sito si blocca appena clicco sul pulsante di invio del modulo. Nella scheda di rete degli strumenti di sviluppo mostra solo la richiesta di post a/login come in sospeso.Altro Passport.js woes - si blocca all'invio del modulo

Per eliminare tutti i possibili problemi aggiunti, ho rimosso Sequelize e utilizzato gli utenti con codice fisso, ad esempio l'uso locale su passport github page. Ancora, nessun cambiamento, per Sequelize non era il problema.

Sono sicuro che è qualcosa di stupido. Ho provato le soluzioni più ovvie, ad esempio assicurandomi che il mio modulo inviasse 'username' e 'password'.

La mia forma è simile al seguente:

form(method="post", action="/login") 
    fieldset 
    legend Please Log In 
    label(for="username") Username: 
    input#username(type='text', name="username", autocomplete="off") 
    label(for="password") Password: 
    input#password(type='password', name="password") 
    button#login(type="submit") Log In 

Nel nodo miei app.js utilizza un router, che comprende questo:

var login = require('../app/controllers/login'); 
app.get('/', login.index); 
app.post('/login', login.auth); 

Il caricamento della pagina ok sulla richiesta GET. Sul post it indirizza a questo:

exports.auth = function (req, res, next) { 
    console.log(req.body); 
    passport.authenticate('local', { 
    successRedirect: '/home', 
    failureRedirect: '/', 
    failureFlash: true 
    }); 
}; 

Il console.log (req.body) viene sull'indennità, che mostra i valori della forma, quindi siamo ok a quel punto. Ma niente dopo. Questa è l'ultima parte:

passport.use(new LocalStrategy(
    function(username, password, done) { 
    console.log('local strat invoked'); 
    findByUsername(username, function(err, user) { 
     if (err) { return done(err); } 
     if (!user) { return done(null, false, { message: 'Unknown user ' + username }); } 
     if (user.password != password) { return done(null, false, { message: 'Invalid password' }); } 
     return done(null, user); 
    }); 
    } 
)); 

Ho scambiato il codice che utilizza Sequelize per controllare il DB per l'utente con questa funzione findByUsername (copiato e incollato direttamente dal post di cui sopra sulla pagina del passaporto GitHub), ma siccome il console.log ('local strat invoked') non sta uscendo, non credo che nulla dopo quel punto sia importante.

Include anche passport.serializeUser e passport.deserializeUser, ma non riesco a immaginare quelli sono il problema nella fase in cui sono bloccato.

Qualche idea su quale passaggio mi manca per ottenere questo funzionamento?

risposta

27

Passport è un middleware, se si incorpora in una funzione di gestore di percorso, è necessario invocarlo:

exports.auth = function (req, res, next) { 
    console.log(req.body); 
    passport.authenticate('local', { 
    successRedirect: '/home', 
    failureRedirect: '/', 
    failureFlash: true 
    })(req, res, next); // <-- NEED TO INVOKE WITH req, res, next 
}; 

o, più semplicemente utilizzarlo come middleware (che è l'approccio consigliato:

exports.auth = passport.authenticate('local', { 
    successRedirect: '/home', 
    failureRedirect: '/', 
    failureFlash: true 
}); 
+0

L'invocazione era il problema Grazie! Il metodo di middleware che non avrei mai potuto ottenere, ho bisogno di rivisitarlo. – DrHall