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.