Javascript req.session.passport.user未定义
我找不到错误,我的方法没有序列化用户。 在passport.serialized User中,我看到了数组的用户,但当我触发受保护路由时,req.isAuthenticated总是返回false 我的护照档案: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.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解析器
(两者都使用不同的秘密?)。也许这引起了一个问题。我改变了秘密,同样的问题:(