TransWikia.com

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

Stack Overflow en español Asked by Ignacio Herrera on December 23, 2021

Soy nuevo con este framework y estaba intentando hacer una prueba de ‘Registro y Login’ con PassportJS + Express + Node.js + MongoDB y Redis. El registro funciona perfecto y aparentemente el login también, el problema está en que al logearse quiero mostrar un mensaje que diga “Bienvenido #nombre_de_usuario” y para eso utilizo req.session.passport.user.nombre (Ver routes.js) pero me devuelve: “TypeError: cannot read property “user” of undefined.”´

Leí varios post con posibles soluciones y vengo tratando de implementarlas hace un par de horas sin aún resolver nada. Me gustaría lograr que funcione con passport sin tener que usar algo anternativo como cookie-session.

Cualquier idea es sumamente apreciada!

Les paso las partes del codigo relacionadas con esto:

usuario.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;

Servidor.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;

One Answer

¡Hola! son varios asuntos los que hay que corregir:

En routes.js debes invocar la funcion local para que use las estrategias y habilite el enpoint de logueo.

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;

Ahora, recuerda usar req.user para obtener el objeto del usuario logueado. Ya que Passport (como middleware) se encarga de asignar al objeto request (req), una propiedad llamada 'user' Ver código fuente

Answered by Carlochess on December 23, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP