Utilizzando Nodejs passaporto, mi stava testando che cosa succede quando si verifica una condizione di errore utilizzando il seguente codice:Nodejs passaporto autenticare callback non essere chiamato
passport.use(new LocalStrategy(
function(username, password, done) {
// asynchronous verification, for effect...
process.nextTick(function() {
findByUsername(username, function(err, user) {
console.log('in auth function');
return done('errortest');
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);
})
});
}
));
app.get('/logintest', function(req, res, next) {
console.log('before authenticate');
passport.authenticate('local', function(err, user, info) {
console.log('authenticate callback');
if (err) { return res.send({'status':'err','message':err.message}); }
if (!user) { return res.send({'status':'fail','message':info.message}); }
req.logIn(user, function(err) {
if (err) { return res.send({'status':'err','message':err.message}); }
return res.send({'status':'ok'});
});
})(req, res, next);
});
secondo l'itinerario/logintest username = bob & Password = s? Mi aspettavo di vedere nella console, "prima di autenticare", quindi "nella funzione di autenticazione", quindi "autenticare la richiamata", ma mostra solo i primi due seguiti da "errortest" e "errortest" viene visualizzato nel browser.
Ho anche provato return done({'message':'test'});
e "[oggetto oggetto]" è stato visualizzato nella console e nel browser.
Non funziona correttamente o mi manca qualcosa?
EDIT: Come per risposta di Jared Hanson, l'aggiunta di questa funzione del gestore di errore come il terzo argomento di app.get() mi permette di intercettare l'errore e restituire il JSON appropriata:
...
})(req, res, next);
},
function(err, req, res, next) {
// failure in login test route
return res.send({'status':'err','message':err.message});
});
Grazie per la risposta rapida. Sono abbastanza nuovo su node.js ma il caso d'uso sta effettuando l'accesso tramite una chiamata jquery ajax. Volevo restituire un oggetto json con lo stato: "ok" per il successo, "fail" per nome utente/password errati e "err" se si è verificato un errore. (Nota la modifica del codice che ho creato per il successo.) – KevinVictor
Quindi, quando viene richiamato il callback personalizzato, err è sempre nullo? – KevinVictor
Ha pubblicato un seguito sul problema GitHub, in modo da poter formattare meglio il codice. https://github.com/jaredhanson/passport-local/issues/15 –