PassportJS + Express with Node.js, req.session.passport Undefined

0

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;
    
asked by Ignacio Herrera 21.02.2018 в 05:05
source

1 answer

0

Hello! There are several issues that need to be corrected:

In routes.js you must invoke the function local to use the strategies and enable the login point.

var passport = require('passport');
var local = require('./local');

var routes = function(app){
  app.get('/user', function(req, res){
    res.send("Bienvenido: "+req.user.nombre);
  });
  app.get('/error', function(req, res){
    res.send("Nope");
  });
  app.post('/login', passport.authenticate('user',
                                           {successRedirect: '/user',
                                            failureRedirect: '/error'}));
  local(app);
};

module.exports = routes;

Now, remember to use req.user to get the object of the logged in user. Since Passport (as middleware) is responsible for assigning to the request object (req), a property called 'user' View source code

    
answered by 22.02.2018 в 06:35