req.session.passport.user未定义

我找不到错误,我的方法不会序列化用户。 在passport.serializeUser中,我看到数组的用户,但是当我触发受保护的路由时,req.isAuthenticated,总是返回false

我的护照文件:

passport.serializeUser(function(user, done){ console.log('OK')//is show in console done(null, user); }); passport.deserializeUser(function(id, done){ User.findById(id, function(err, user){ done(err, user) }); }); passport.use('login', new LocalStrategy({ usernameField : 'username', passwordField : 'password', passReqToCallback: true }, function(req, username, password, done){ process.nextTick(function(){ User.findOne({'username' : username}, function(err, user){ if(err){ return done(err); } if(!user){ return done(null, false); } if(!user.validPassword(password)){ return done(null, false); } return done(null, user); }); }); } )) 

我的login路线:

 app.post('/api/login', function(req, res, next){ passport.authenticate('login', function(err, user){ if(err){ res.json({sucesso: false, mensagem: 'Erro ao logar', erro: err}); } else{ req.logIn(user, function(err) { if(err){ console.log('ERRO ' + err); } else{ var token = jwt.encode(user, 'JwTaUtHaNGULAR'); return res.send({sucesso: true, token: 'JWT ' + token, mensagem: 'Autenticação OK'}); } }); } })(req, res, next); }); 

这是我受保护的路线:

 app.get('/api/dashboard/users', isLogged ,function(req, res){ Usuario.find({'_id': {$ne: id_user}}, function(err, usuario){ res.json({sucesso: true, user: usuario}); }); }); 

我的function,检查用户是否通过身份validation:

 function isLogged(req, res, next){ if(req.isAuthenticated()){ return next(); } else{ console.log('ERRO'); } } 

这是我的server.js:

 var express = require('express'); var app = express(); var mongoose = require('mongoose'); var passport = require('passport'); var flash = require('connect-flash'); var morgan = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var session = require('express-session'); var config = require('./config/database'); var methodOverride = require('method-override') mongoose.connect(config.database, function(err, db){ if(!err){ console.log('Conectado'); } }); var server = require('http').Server(app); var io = require('socket.io')(server); var cors = require('cors'); require('./config/passport')(passport); app.use(morgan('dev')); app.use(cookieParser('secret')); app.use(bodyParser.urlencoded({extended: true})); app.use(bodyParser.json()); app.use(session({ secret: 'SecretSession', resave: false, saveUninitialized: true })); app.use(passport.initialize()); app.use(passport.session()); app.use(methodOverride()); app.use(express.static(__dirname + '/public')) app.use(cors()); require('./app/routes')(app, passport); server.listen(3030, function(){ console.log('Rodando '); }); 

哪里不对?

您正在通过其ID反序列化用户,但通过使用整个用户对象序列化它们。 尝试更改passport.serializeUser

 passport.serializeUser(function(user, done){ console.log('OK')//is show in console done(null, user.id); }); 

所以你也通过他们的ID序列化用户。 此外,它看起来像你正在使用两种不同的mongoose模型UserUsuario用户是这样的意图?

更新:我再看看你的代码,并同意上面的评论员。 您正在混合基于会话的身份validation和基于令牌的身份validation。 您在passport.authenticate回复了一个JWT,但稍后在isLogged不会使用它来validation身份validation(就像您通常在基于令牌的方法中那样)。

所以我认为解决scheme是删除智威汤逊。 使用会话cookie 令牌在你的情况下没有多大意义(如果你不同意,请留下评论为什么你使用智威汤逊)。 因此,应用上面的serializeUser修复,只需使用默认的passport.authenticate('local')callback,你的代码应该按预期工作。