tutorial password nodejs node management node.js session express passport.js passport-local

node.js - password - passport local mongoose



req.session.passport y req.user empty, serializeUser y deserializeUser nunca se llaman (1)

req.login() llamar a req.login() en la devolución de llamada personalizada, que luego llamará a serializeUser y establecerá el objeto de usuario para la sesión:

app.post(''/login'', function (req, res, next) { passport.authenticate(''local-login'', function (err, user, info) { if (err) { mysend(res, 500, ''Ups. Something broke!''); } else if (info) { mysend(res, 401, ''unauthorized''); } else { req.login(user, function(err) { if (err) { mysend(res, 500, ''Ups.''); } else { mysend(res, 200, JSON.stringify(user)); } } } })(req, res, next); });

Estoy usando Express (v4.11.2) con Passport para dar soporte a múltiples proveedores (locales, facebook, twitter y google) para acceder a la aplicación web que estoy creando. Como backend estoy usando mysql. Por ahora tengo dos estrategias locales: registro local e inicio de sesión local. El problema que estoy experimentando es que req.session.passport y req.user están siempre vacíos y que, de hecho, serializeUser y deserializeUser nunca se están llamando.

Aquí está la configuración de expreso y pasaporte:

var bodyParser = require(''body-parser''); var session = require(''express-session''); var MemoryStore = session.MemoryStore; var _ = require(''underscore''); var passport = require(''passport''); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended: true})); app.use(session({ key: ''KEY'', secret: ''SECRET331156%^!fafsdaasd'', store: new MemoryStore({reapInterval: 60000 * 10}), saveUninitialized: true, resave: false })); app.use(passport.initialize()); app.use(passport.session()); require(''./config/passport'')(passport); // pass passport for configuration

y aquí está el archivo de pasaporte con estrategias de autenticación:

module.exports = function (passport) { passport.serializeUser(function (user, done) { logger.info(''SERIALIZE USER''); done(null, user.id); }); passport.deserializeUser(function (id, done) { logger.info(''DESEIRALIZE USER!''); mysqllib.getConnection(function (err, connection) { if (err) { done(err); } var sql = "SELECT * FROM users WHERE idusers = ?"; logger.info(''sql: '' + sql); connection.query(sql, [id], function (err, rows) { connection.release(); var user = {}; user.id = rows[0].idusers; done(err, user.id); }); }); }); passport.use(''local-signup'', new LocalStrategy({ usernameField: ''email'', passwordField: ''password'', passReqToCallback: true // allows us to pass back the entire request to the callback }, function (req, email, password, done) { logger.info(''CALLING local-signup''); var firstname = req.body.firstname; var lastname = req.body.lastname; var role = req.body.role; mysqllib.getConnection(function (err, connection) { var sql = "INSERT INTO users VALUES(0, ?, ?, ?, ?, null, ?, 0, null, null, null, null, null, null, 0, 0)"; logger.info(''sql: '' + sql); connection.query(sql, [email, password, firstname, lastname, role], function (err, rows) { connection.release(); if (err) { if (err.code == ''ER_DUP_ENTRY'') { logger.info(''er_dup_entry''); return done(err); } else { logger.info(''general err''); return done(err); } } else { logger.info(''everything is OK!''); var user = {}; user.id = rows.insertId; req.session.user_auth = user.id; return done(null, user); } }); }); })); passport.use( ''local-login'', new LocalStrategy({ usernameField: ''email'', passwordField: ''password'', passReqToCallback: true // allows us to pass back the entire request to the callback }, function (req, email, password, done) { mysqllib.getConnection(function (err, connection) { if (err) { logger.info(''getConnection: '' + err); return done(err); } var sql = "SELECT idusers, first_name, last_name, email, phone, dob, address, role, photo1, photo2, photo3, photo4, phonevalidated, uservalidated FROM users WHERE email = " + connection.escape(email) + " AND password = " + connection.escape(password); connection.query(sql, function (err, rows) { connection.release(); if (err) { logger.error("select user", err); return done(err); } else if (rows.length) { var user = rows[0]; user.id = rows[0].idusers; return done(null, user); } else { logger.warn(''Incorrect Login credentials, username: '' + email + '' password: '' + password); return done(null, false, {message: ''unauthorized''}); } }); }); }) ); };

y, por último, así es como estoy usando las estrategias en las rutas expresas:

app.post(''/login'', function (req, res, next) { passport.authenticate(''local-login'', function (err, user, info) { if (err) { mysend(res, 500, ''Ups. Something broke!''); } else if (info) { mysend(res, 401, ''unauthorized''); } else { mysend(res, 200, JSON.stringify(user)); logger.info(req.user); logger.info(req.session); } })(req, res, next); });

Todo funciona bien, incluso en una estrategia puedo establecer el valor de la identificación del usuario en la sesión de esta manera:

req.session.user_id = user.id

y continúo usándolo manualmente pero realmente no entiendo por qué serializeUser y deserializeUser no se están llamando.