¡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.
Esta es una gran solución, solo quiero agregar esto:
var expressJwt = require('express-jwt'); app.use('/api', expressJwt({secret: secret}));
Me gusta usar "express-jwt" para validar el token.
Por cierto: este artículo es excelente para aprender cómo manejar el token en el lado del cliente, usando Angular, para enviarlo de vuelta con cada solicitud
https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/
fuente
express-jwt
hacer autenticación, pero leyendo la documentación de otros paquetes comopassport-jwt
, creo que seguiré cumpliendoexpress-jwt
. Mucho más simple, mucho más agradable OMIAquí hay una placa de caldera en la que estoy trabajando para usar específicamente solo tokens de API (sin sesiones ... no esa sesión es mala, por supuesto; solo estamos usando el enfoque de token): https://github.com/roblevintennis/passport -api-tokens
fuente