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;
¡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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP