Javascript req.session.passport.user未定义

Javascript req.session.passport.user未定义,javascript,node.js,express,passport-local,Javascript,Node.js,Express,Passport Local,我找不到错误,我的方法没有序列化用户。 在passport.serialized User中,我看到了数组的用户,但当我触发受保护路由时,req.isAuthenticated总是返回false 我的护照档案: passport.serializeUser(function(user, done){ console.log('OK')//is show in console done(null, user); }); passport.deserializeUser(funct

我找不到错误,我的方法没有序列化用户。 在passport.serialized User中,我看到了数组的用户,但当我触发受保护路由时,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);

        });
    });
}
))
我的登录路径:

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});
    });
});
检查用户是否经过身份验证的My函数:

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.user
更改为

passport.serializeUser(function(user, done){
    console.log('OK')//is show in console
    done(null, user.id);
});
因此,您也在按用户ID序列化用户。此外,您似乎正在为用户使用两种不同的mongoose模型
User
Usuario

更新:我再次查看了您的代码,并同意上述评论员的观点。您混淆了基于会话的身份验证和基于令牌的身份验证。您在
passport中使用JWT进行回复。进行身份验证
,但以后不要在
IsLoged
中使用JWT来验证身份验证(就像您通常在基于令牌的方法中所做的那样)


因此,我认为解决方案是删除JWT。在您的情况下,使用会话cookie和令牌没有多大意义(如果您不同意,请留下您为什么使用JWTs的评论)。因此,应用上面的
serializeUser
fix,只需使用默认的
passport.authenticate('local')
回调,您的代码就会按预期工作。

我尝试将user更改为user.id和user.\u id,但仍然没有序列化。模型的用户也是同样的问题。我取下JWT,做了​​另一个请求是angular,但问题是您似乎将JWT与“常规”(基于cookie)会话混合在一起,这可能是一个问题。另外,您是否使用AJAX检索受保护的路由?如果是,请确保它使用。如果您使用的是Angular,请参阅(查找
withCredentials
选项)。是的,我使用ajax。我配置了Credentials:true,但是错误持续存在,并且我启用了CORS也
express session
将设置cookie本身,但是您也在使用
cookie解析器
(两者都使用不同的秘密?)。也许这引起了一个问题。我改变了秘密,同样的问题:(