Reputation: 237
I can not find the error, my method does not serialize the user. Within passport.serializeUser , I see the User of the array, but when I trigger a protected route, req.isAuthenticated , always returns me false
My passport file:
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);
});
});
}
))
My login route:
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);
});
Here is my protected route:
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 that checks whether the user is authenticated:
function isLogged(req, res, next){
if(req.isAuthenticated()){
return next();
}
else{
console.log('ERRO');
}
}
Here is my 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 ');
});
What is wrong?
Upvotes: 1
Views: 4368
Reputation: 728
You are deserializing users by their ID but serialize them by using the whole user object. Try changing passport.serializeUser
to
passport.serializeUser(function(user, done){
console.log('OK')//is show in console
done(null, user.id);
});
so you are also serializing users by their ID. Additionally it looks like you are using two different mongoose models User
and Usuario
for users is this intended?
Update: I took another look at your code and agree with the above commentator. You are mixing up session-based authentication and token-based authentication. You reply with a JWT in passport.authenticate
but do not use it later in isLogged
to verify the authentication (like you would normally do in a token-based approach).
So the solution in my opinion is to remove JWTs. Using session cookies and a token does not make much sense in your case (if you disagree please leave a comment why you are using JWTs). So apply the above serializeUser
fix and simply use the default passport.authenticate('local')
callback and your code should work as expected.
Upvotes: 1