I am new with this framework and I was trying to do a 'Registration and Login' test with PassportJS + Express + Node.js + MongoDB and Redis. The registry works perfectly and apparently the login also, the problem is that when logging in I want to show a message that says "Welcome #username" and for that I use req.session.passport.user.name (See routes.js) but it returns: " TypeError: can not read property" user "of undefined ." '
I read several posts with possible solutions and I have been trying to implement them a couple of hours ago without yet solving anything. I would like to make it work with passport without having to use something anternative like cookie-session.
Any idea is highly appreciated!
I pass the parts of the code related to this:
user.js
var models = require('./models'),
Schema = models.Schema;
var usuariosSchema = new Schema({
nombre: String,
edad: String,
usuario: String,
password: String,
});
var Usuario = models.model('Usuario', usuariosSchema, 'usuario_sesion');
exports.registroFuncion = function(req, res, next){
var user = new Usuario({
nombre: req.body.nombre,
edad: req.body.edad,
usuario: req.body.usuario,
password: req.body.pass
});
user.save(function(err, usuario){
if(!err){
res.status(201);
next();
}else{
res.status(400);
res.send('Ha ocurrido un problema.');
}
});
};
local.js
var passport = require('passport'),
passportLocal = require('passport-local'),
LocalStrategy = passportLocal.Strategy;
var Usuario = require('./models/usuario');
var localConnection = function(app){
passport.use('user', new LocalStrategy({
//Define campos como: "xxx"
usernameField: 'usuario',
passwordField: 'password'
},
function(username, password, done){
Usuario.findOne({usuario:username}, function(err, user){
if(err){ return done(err); }
if(!user){
return done(null, false, {message: "Incorrect Username."});
}else{
if(user.password != password){
return done(null, false, {message: "Incorrect Password"});
}else{
//Usuario existe y clave correcta, retorna el usuario
return done(null, user);
}
}
});
}
));
app.post('/login', passport.authenticate('user', {successRedirect: '/user',
failureRedirect: '/error', failureFlash: 'User o pass equivocado.'}));
};
module.exports = localConnection;
Server.js
var express = require('express'),
app = express(),
server = require('http').createServer(app);
/* Almacenamiento variables de session */
var session = require('express-session');
var RedisStore = require('connect-redis')(session);
var passport = require('passport');
//Flash: Mensajes temporales de respuesta
var flash = require('connect-flash');
/* // */
// Recordar activar server en terminal con > redis-server
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var path = require('path');
var swig = require('swig');
/* Renderizado */
app.engine('html', swig.renderFile);
app.set('view engine', 'html');
app.set('views', __dirname+'/views');
app.set('view cache', false);
swig.setDefaults({cache: false});
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(cookieParser('nextapp'));
app.use(express.static(path.join(__dirname, 'public')));
/* Variables de sesion */
app.use(session({
store: new RedisStore({}),
secret: 'nextapp',
resave: true,
saveUninitialized: true,
cookie: {
expires: false,
secure: false
}
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());
passport.serializeUser(function(user, done){
console.log("Serialize: "+user);
done(null, user);
});
passport.deserializeUser(function(obj, done){
console.log("Deserialize: "+obj);
done(null, obj);
});
/* Rutas */
var routes = require('./routes/routes');
routes(app);
/* Conexiones */
var local = require('./local');
/* Server ON */
var port = Number(process.env.PORT || 3000);
server.listen(port, function(){
console.log('Servidor corriendo en localhost:'+port);
});
routes.js
var usuario = require('../controllers/usuario');
var local = require('../local');
var routes = function(app){
app.get('/', function(req, res){
res.render('login');
});
app.get('/user', function(req, res){
res.send("Bienvenido: "+req.session.passport.user.nombre);
});
app.get('/error', function(req, res){
res.send(req.session.flash.error[0]);
});
app.get('/registro', function(req, res){
res.render('registro');
});
app.post('/registro', usuario.registroFuncion, function(req, res){
res.redirect('/');
});
app.post('/login', function(req, res){
res.redirect('/user');
});
};
module.exports = routes;