¡Me lo imaginé!
En primer lugar, debe implementar la estrategia correcta. En mi caso, LocalStrategy, y debe proporcionar su lógica de validación. Por ejemplo, usemos el de 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 devolución de llamada de verificación que proporcione function(username, password, done)
se encargará de encontrar a su usuario y verificar si la contraseña coincide (más allá del alcance de la pregunta y mi respuesta)
passport.js espera varias piezas para que funcione, una es que devuelva al usuario en la estrategia. Estaba tratando de cambiar esa parte del código y eso estaba mal. La devolución de llamada espera false
si la validación falla y un object
(el usuario validado) si tiene éxito.
Ahora ... ¿cómo integrar JWT?
En su ruta de inicio de sesión, tendrá que manejar una autenticación exitosa o una no exitosa. Y es aquí donde debe agregar la creación del token JWT. Al igual que:
(recuerde deshabilitar la sesión, de lo contrario, tendrá que implementar las funciones de serialización y deserialización. Y no las necesita si no persiste la sesión, lo cual no es así si está utilizando una autenticación basada en token)
De ejemplos de pasaporte local: (con el token JWT agregado)
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);
});
¡Y eso es todo! Ahora, cuando llame / inicie sesión y POST nombre de usuario y contraseña (que siempre debe ser sobre SSL), el primer fragmento de código anterior intentará encontrar un usuario en función del nombre de usuario que proporcionó y luego comprobará que la contraseña coincida (por supuesto, deberá cámbielo para adaptarlo a sus necesidades).
Después de eso, se llamará a su ruta de inicio de sesión y allí podrá encargarse de devolver un error o un token válido.
Espero que esto ayude a alguien. Y si he cometido algún error u olvido algo, avíseme.