L'avevo capito!
Prima di tutto devi implementare la strategia corretta. Nel mio caso LocalStrategy e devi fornire la tua logica di convalida. Ad esempio, usiamo quello in passport-local.
var passport = require('passport')
, LocalStrategy = require('passport-local').Strategy;
passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, function(err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
if (!user.validPassword(password)) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user);
});
}
));
la richiamata di verifica che fornisci function(username, password, done)
si occuperà di trovare il tuo utente e controllare se la password corrisponde (oltre lo scopo della domanda e della mia risposta)
passport.js si aspetta che funzioni diverse, una è che tu restituisca l'utente nella strategia. Stavo cercando di cambiare quella parte del codice, ma era sbagliato. Il callback si aspetta false
se la convalida fallisce e un object
(l'utente convalidato) se hai successo.
Ora .... come integrare JWT?
Nella tua rotta di accesso dovrai gestire un'autenticazione riuscita o una non riuscita. Ed è qui che devi aggiungere la creazione del token JWT. Così:
(ricorda di disabilitare la sessione, altrimenti dovrai implementare le funzioni di serializzazione e deserializzazione. E non ti servono se non stai persistendo la sessione, cosa che non sei se stai usando un'autenticazione basata su token)
Da esempi passport-local: (con il token JWT aggiunto)
app.post('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err) }
if (!user) {
return res.json(401, { error: 'message' });
}
var token = jwt.encode({ username: 'somedata'}, tokenSecret);
res.json({ token : token });
})(req, res, next);
});
E questo è tutto! Ora quando chiami / accedi e POST nome utente e password (che dovrebbe essere sempre su SSL) il primo frammento di codice sopra proverà a trovare un utente in base al nome utente fornito e quindi controllerà che la password corrisponda (ovviamente dovrai cambiarlo in base alle proprie esigenze).
Dopodiché verrà chiamata la tua rotta di accesso e lì potrai occuparti di restituire un errore o un token valido.
Spero che questo possa aiutare qualcuno. E se ho fatto degli errori o ho dimenticato qualcosa fammelo sapere.