El pasaporte no se guarda dentro de la variable de sesión. req.user no existe después de navegar

Fondo:

Tengo un angular-cli ejecutándose en el puerto 4200, y el servidor api node.js ejecutándose en 3000.

Descubrí que el valor del pasaporte de la sesión no se guardará después de iniciar sesión con el pasaporte local.

así que cuando trato de navegar a otra página después de iniciar sesión, no tengo el pasaporte, la variable en las sesiones como se supone que debe hacerlo, se requiere que llame a req.user

Por alguna razón, el servidor no está llamando al usuario deserializar.

Req.user no funciona después de iniciar sesión y redirigir a la página / prueba.

Actualizar:

Para iniciar sesión, envío una solicitud desde el sitio utilizando el puerto 4200, con el siguiente código: (angular2 / 4)

 performLogin(name: string, password: string): Observable { var params = new URLSearchParams(); params.append('username', name); params.append('password', password); url = "SITE:3000/api/login"; return this.http.post(this.url,params, this.options) .map(result => result.json()) .do(result => this.result = result); } 

Actualización 2: solicitud de credenciales insertados cliente echado a un lado. En cada solicitud de inicio de sesión -> luego llamando a la página de prueba siempre obtengo:

 ReferenceError: User is not defined at /root/mafiagame/src/config/passport.js:32:9 at pass (/usr/lib/node_modules/passport/lib/authenticator.js:347:9) at Authenticator.deserializeUser (/usr/lib/node_modules/passport/lib/authenticator.js:352:5) at SessionStrategy.authenticate (/usr/lib/node_modules/passport/lib/strategies/session.js:53:28) at attempt (/usr/lib/node_modules/passport/lib/middleware/authenticate.js:348:16) at authenticate (/usr/lib/node_modules/passport/lib/middleware/authenticate.js:349:7) at Layer.handle [as handle_request] (/root/mafiagame/node_modules/express/lib/router/layer.js:95:5) at trim_prefix (/root/mafiagame/node_modules/express/lib/router/index.js:317:13) at /root/mafiagame/node_modules/express/lib/router/index.js:284:7 at Function.process_params (/root/mafiagame/node_modules/express/lib/router/index.js:335:12) at next (/root/mafiagame/node_modules/express/lib/router/index.js:275:10) at initialize (/usr/lib/node_modules/passport/lib/middleware/initialize.js:53:5) at Layer.handle [as handle_request] (/root/mafiagame/node_modules/express/lib/router/layer.js:95:5) at trim_prefix (/root/mafiagame/node_modules/express/lib/router/index.js:317:13) at /root/mafiagame/node_modules/express/lib/router/index.js:284:7 at Function.process_params (/root/mafiagame/node_modules/express/lib/router/index.js:335:12) 

Problemas relacionados, que no solucionaron mi problema:

Passportjs no guarda al usuario en sesión después de iniciar sesión

PassportJS deserializeUser nunca llamado

Sesión Express Passport no funciona

req.session.passport está vacío, deserializeUser no llamado – ExpressJS, Passport

Problema principal: Req.user no funciona después de iniciar sesión y redirigir a la página / prueba.

Parece que la sesión está guardada, pero los detalles del pasaporte dentro de esa sesión no lo están.

Mi aplicación:

volcado de req.session después de iniciar sesión:

  Session { cookie: { path: '/', _expires: 2017-05-03T19:42:58.728Z, originalMaxAge: 14400000, httpOnly: true, secure: false }, passport: { user: '5909a6c0c5a41d13340ecf94' } } 

sesión durante la visita / prueba

 Session { cookie: { path: '/', _expires: 2017-05-03T19:43:10.503Z, originalMaxAge: 14400000, httpOnly: true, secure: false } } 

server.js

Aquí está mi server.js con el expreso, pasaporte, etc.

 var express = require('express'); // call express var app = express(); // define our app using express var bodyParser = require('body-parser'); var mongoose = require('mongoose'); var session = require('express-session'); var router = express.Router(); var Account = require('src/app/models/Users.js'); var Core = require('src/app/gamemodels/core'); // Init passport authentication var passport = require('passport'); var Strategy = require('passport-local').Strategy; require('src/config/passport')(passport); var cookieParser = require('cookie-parser') app.use(function(req, res, next) { res.header('Access-Control-Allow-Credentials', true); res.header('Access-Control-Allow-Origin', req.headers.origin); res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept'); if ('OPTIONS' == req.method) { res.send(200); } else { next(); } }); // required for passport session app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); mongoose.connect('database'); app.use(cookieParser()) // required before session. app.use(session({ secret: 'xxx', cookie: { secure: false }})); app.use(passport.initialize()); app.use(passport.session()); console.log(mongoose.connection.readyState); app.use(function (req, res, next) { console.log('Time:', Date.now()); // core.loggameRequest(); next(); }); var port = process.env.PORT || 3000; // set our port // test route to make sure everything is working (accessed at GET http://localhost:8080/api) router.get('/', function(req, res) { res.json({ text: 'hooray! welcome to our api!' }); }); router.get('/test', function(req,res) { console.log(req.user); res.json(req.user); }); router.get("/getuser", function(req,res) { Account.findOne({}, function (err,response) { console.log("starting core..."); console.log(Core); console.log("core log end"); // Core.experienceToRankDetails(response.xp,'female'); console.log("executed!"); // res.json(response); Core.experienceToRankDetails(response.xp,'female').then(function (result) { res.json({user: response, rank: result}); }); }); }); router.get('/onlinestate', function(req,res) { if (req.user) { res.json(true); } else { res.json(false); } }); router.post('/signup', passport.authenticate('local-signup', { successRedirect : '/profile', // redirect to the secure profile section failureRedirect : '/signup', // redirect back to the signup page if there is an error })); router.post('/login', passport.authenticate('local-login'), function(req, res) { console.log("executed login!"); console.log(req.user); req.session.user = req.user; req.logIn(req.user, function (err) { // have this in passport login too, but tried it here too . if (err) { return next(err); } }); }); /* router.post('/login', function(req,res) { console.log("routing post login"); console.log(req.body); console.log(req.user); var username = req.body.username; var password = 0; console.log("using passport"); passport.authenticate('local', {failureRedirect: '/login'}, function (req, res) { console.log("performed!"); res.redirect('/'); }); }); */ // more routes for our API will happen here // REGISTER OUR ROUTES ------------------------------- // all of our routes will be prefixed with /api app.use('/api', router); */ // START THE SERVER // ============================================================================= app.listen(port); console.log('Magic happens on port ' + port); 

pasaporte:

 // config/passport.js // load all the things we need var LocalStrategy = require('passport-local').Strategy; // load up the user model var Account = require('src/app/models/Users.js'); // expose this function to our app using module.exports module.exports = function(passport) { passport.serializeUser( function(user, done){ console.log("serialize"); done(null, user.id); }); passport.deserializeUser( function(id, done){ console.log("deserialize " + id); Account.findById(id, function(err, user){ if(err){ done(err); } done(null, user); }); }); passport.use('local-login', new LocalStrategy({ // by default, local strategy uses username and password, we will override with email usernameField : 'username', passwordField : 'password', passReqToCallback : true // allows us to pass back the entire request to the callback }, function(req, username, password, done) { // callback with email and password from our form console.log("doing local login"); // find a user whose email is the same as the forms email // we are checking to see if the user trying to login already exists Account.findOne({ 'username' : username }, function(err, user) { var thisuser = user; console.log("query account is done"); // if there are any errors, return the error before anything else if (err) { console.log("error occured"); return done(err); } console.log("if user exist check"); // if no user is found, return the message if (!user) return done(null, false,'No user found.'); // req.flash is the way to set flashdata using connect-flash console.log("checking password"); // if the user is found but the password is wrong if (!user.validPassword(password)) { console.log("password is not valid"); return done(null, false, 'Oops! Wrong password.'); // create the loginMessage and save it to session as flashdata } console.log("all good! logging in!"); req.login(thisuser, function(error) { if (error) return next(error); console.log(error); console.log("Request Login supossedly successful."); }); // all is well, return successful user return done(null, thisuser); }); })); passport.use('local-signup', new LocalStrategy({ // by default, local strategy uses username and password, we will override with email usernameField : 'email', passwordField : 'password', passReqToCallback : true // allows us to pass back the entire request to the callback }, function(req, username, password, done) { process.nextTick(function() { console.log("doing local signup"); // find a user whose email is the same as the forms email // we are checking to see if the user trying to login already exists Account.findOne({ 'username' : username }, function(err, user) { // if there are any errors, return the error if (err) return done(err); // check to see if theres already a user with that email if (user) { return done(null, false, 'That username is already taken.'); } else { var newUser = new Account(); // set the user's local credentials newUser.username = username; newUser.password = newUser.encryptPassword(password); // save the user newUser.save(function(err) { if (err) throw err; return done(null, newUser); }); } }); }); })); }; 

variable de usuario contiene:

 { _id: 5909a6c0c5a41d13340ecf94, password: '$2a$10$tuca/t4HJex8Ucx878ReOesICV6oJoS3AgYc.LxQqCwKSV8I3PenC', username: 'admin', __v: 0, inFamily: false, bank: 500000, cash: 1, xp: 0, rank: 1, bullets: 0, location: 1, permission: 0, health: 100 } 

respuesta del servidor después de iniciar sesión: (publicar en / ruta de inicio de sesión)

 doing local login query account is done if user exist check checking password all good! logging in! serialize undefined Request Login supossedly successful. serialize executed login! { _id: 5909a6c0c5a41d13340ecf94, password: '$2a$10$tuca/t4HJex8Ucx878ReOesICV6oJoS3AgYc.LxQqCwKSV8I3PenC', username: 'admin', __v: 0, inFamily: false, bank: 500000, cash: 1, xp: 0, rank: 1, bullets: 0, location: 1, permission: 0, health: 100 } serialize 

respuesta del servidor de visitar / prueba

 undefined 

Parece ser un problema angular 2/4. Puedes probar esto o esto

¡Espero que te ayude! 🙂