Passport forwarding error with express 4

Asked

Viewed 132 times

1

I am having problems after user authenticate in form. Passport redirects to the root again, however it does not pass to the express GET of the route '/' and displays [Object Object].

If use

servidor.use(function(err, req, res, next) {
  console.error(err.stack);
  res.status(500).send('Alguma coisa deu errada: \n Detalhes do erro: ' + err.stack);
});

req is receiving the user object I am using to authenticate.

example of the generated log

GET / 302 5539.955 ms - 56
GET /login 200 4440.040 ms - 1824
POST /login 302 947.376 ms - 46
[object Object]
GET / 500 443.628 ms - 142

server.js

const express         = require('express'), 
      servidor        = express(),
      cookieParser    = require('cookie-parser'),
      bodyParser      = require('body-parser'),
      path            = require('path'),
      passport        = require('passport'),
      session         = require('express-session'),
      flash           = require('connect-flash'),
      log             = require('morgan'),
      //favicon       = require('serve-favicon'),
      ambiente        = process.env.NODE_ENV || 'dev';

if(ambiente == 'dev'){
  servidor.set('port', 3000);
}else if(ambiente == 'pro'){
  servidor.set('port', 8080);
}

require('./modelo/autenticacao')(passport);
servidor.set('admin', path.join(__dirname,'public/views/admin'));
servidor.set('views', path.join(__dirname,'public/views'));
servidor.set('view engine', 'html');
servidor.engine('.html', require('ejs').__express);
servidor.use(express.static(path.join(__dirname,'public')));
servidor.use(log(ambiente));
servidor.use(cookieParser());
servidor.use(bodyParser.urlencoded({ extended: true }));
servidor.use(bodyParser.json());
servidor.use(session({
  secret: "Ch4v3GPL0G",
  resave: true,
  saveUninitialized: true,
  cookie:{
    secure: false,
    expires: Date.now() + 12 * 60 * 60 * 1000 // validade de 12 hrs
  }
}));
servidor.use(passport.initialize());
servidor.use(passport.session()); 
servidor.use(flash()); 

require('./rotas')(servidor, passport);

servidor.listen(servidor.get('port'), function(){
  console.log("Servidor rodando na porta: " + servidor.get('port'));     
});

Autenticacao.js

var EstrategiaLocal = require('passport-local').Strategy,
    Usuario         = require('./bd/_usuario');

module.exports = function(passport){

  passport.serializeUser(function(usuario, done) {
    done(null, usuario.login);
  });

  passport.deserializeUser(function(login, done) {
    Usuario.BuscarUm(login, function(erro, usuario){
      if(erro){return done(erro)}
      done(null, usuario)
    });
  });

  passport.use('local', new EstrategiaLocal({
    usernameField : 'login',
    passwordField : 'senha',
    passReqToCallback : true
  },
    function (req, nome_usuario, senha, done){
      Usuario.BuscarUm(nome_usuario, function(usuario){
        if(!usuario){ 
          return done(null, false, req.flash('loginMessage', 'Usuario não encontrado.'));
        }
        if(usuario.VerificaSenha(senha)){
          if(usuario.ativo){
            return done(null, usuario);
          }else{
            return done(null, false, req.flash('loginMessage', 'Usuario não está ativo.'));
          }          
        }else{
          return done(null, false, req.flash('loginMessage', 'Senha ou usuário incorreto.'));
        }
      });
    }
  ));

  return passport;
};

routes

var get             = require('./get'),
    post            = require('./post');

module.exports = function(app, passport){
  post(app, passport);
  get(app, passport);
}

get js.

module.exports = function(rota, passport){

  rota.get('/login', function(req, res){
    if(req.isAuthenticated()) res.redirect('adm/dashboard');
    res.render('login');
  });

  rota.get('/adm/dashboard', EstaAutenticado, function(req, res){
    res.render('adm/dashboard');
  });

  rota.get('/', EstaAutenticado, function(req, res){
    res.render('adm/dashboard');
  });

  rota.get('/logout', EstaAutenticado, function(req, res){
    req.logout();
    req.session.destroy();
    res.render('login');
  });
};

function EstaAutenticado(req, res, next){
  if(req.isAuthenticated())
    return next();
   res.redirect('/login');
};

post js

module.exports = function(rota, passport){
  rota.post('/login', passport.authenticate('local', {
    successReturnToOrRedirect: '/',
    failureRedirect: '/login',
    failureFlash: true
  })); 

};
  • That route rota.post( must receive the third argument. That is rota.post('/login', passport.authenticate(etc...), (req, res) => res.redirect('/pagina-interna));

1 answer

0


I actually found my error, in the deserializeUser function, I was passing the wrong parameter and 'error' was my user object and 'user' was the error generated if the user was not found. So I was always passing my user as an error to the Passport.

passport.deserializeUser(function(login, done) {
    Usuario.BuscarUm(login, function(erro, usuario){
      if(erro){return done(erro)}
      done(null, usuario)
    });
  });

Browser other questions tagged

You are not signed in. Login or sign up in order to post.