node.js - simple - jwt php
pasaporte local con node-jwt-simple (3)
¿Cómo puedo combinar el pasaporte local para devolver un token JWT con la autenticación exitosa?
Quiero usar node-jwt-simple y mirar passport.js No estoy seguro de cómo hacerlo.
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);
});
}
));
¿Es posible devolver el token cuando se llama a done ()? Algo como esto ... (solo pseudo código)
if(User.validCredentials(username, password)) {
var token = jwt.encode({username: username}, tokenSecret);
done(null, {token : token}); //is this possible?
}
Si no, ¿cómo puedo devolver el token?
¡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, sake, usemos el que está en pasaporte 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 función de verificación de devolución de llamada 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 devuelve al usuario en la estrategia. Estaba intentando 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, deberá gestionar una autenticación exitosa o una incorrecta. 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 serializar y deserializar. Y no las necesita si no persiste en la sesión, que no es así si está utilizando una autenticación basada en token)
Ejemplos de pasaporte local: (con el token JWT agregado)
// POST /login
// This is an alternative implementation that uses a custom callback to
// achieve the same functionality.
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'' });
}
//user has authenticated correctly thus we create a JWT token
var token = jwt.encode({ username: ''somedata''}, tokenSecret);
res.json({ token : token });
})(req, res, next);
});
¡Y eso es todo! Ahora cuando llamas / ingresas y el nombre de usuario y la contraseña de POST (que siempre deben estar en SSL), el primer fragmento de código anterior intentará encontrar un usuario basado en el nombre de usuario que proporcionaste y luego verificarás que la contraseña coincida (por supuesto, necesitarás cambia eso para satisfacer tus 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 olvidé algo, házmelo saber.
Aquí hay una placa de calderas en la que estoy trabajando específicamente para usar tokens de API (no hay sesiones ... esa sesión no es mala por supuesto, solo estamos usando el método token): https://github.com/roblevintennis/passport-api-tokens
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 a 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/