tutorial simple node jsonwebtoken example decoded create node.js authentication token jwt passport.js

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.



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/