user3154516
user3154516

Reputation: 11

Passport.js only redirect to failure page, without calling the LocalStrategy

I have a persistent problem with Passport.js in my Express.js small application : whatever I put in the LocalStrategy, I'm always redirected to the failureRedirect, apparently without even pass by the LocalStrategy... What did I wrong ? And how can I print/display the largest error log to follow the execution ?

var express = require('express'),
  passport = require('passport'),
  LocalStrategy = require('passport-local').Strategy;
  http = require('http'),
  path = require('path'),
  mysql = require('mysql'),
  flash = require('connect-flash');
var app = express();

// SQL connexion
var sqlInfo = {
  host: 'localhost', 
  user: 'root',
  password: '', 
  database: 'mex'
};
global.client = mysql.createConnection(sqlInfo);
client.connect(function(err) {
    if(err)
        console.log(err);
});

app.configure(function(){
    app.set('views', __dirname+'/views');
    app.set('port', process.env.PORT || 85);
    //app.engine('ejs', engine);
    app.use(express.static('public'));
    app.use(express.cookieParser());
    app.use(express.bodyParser());
   // 1 - Session express
    app.use(express.session({ secret: 'secretpass' }));
    // 2 - Init et session Passeport
    app.use(passport.initialize());
    app.use(passport.session());

    app.use(flash());
    app.use(express.logger());

    app.use(app.router);

});

// Simple logger
app.use(function(req, res, next){
  console.log('%s %s', req.method, req.url);
  next();    

passport.use(new LocalStrategy(
    function(username, password, done) {
        console.log("localstrategy ---");
        var user = {username: '[email protected]', password: 'pwd'};
        return done(null, user);
}));

passport.serializeUser(function(user, done) { 
  // JUST 4 TEST
  done(null, user);
});

passport.deserializeUser(function(user, done) { 
  // JUST 4 TEST
  done(null, user);
});

// Home
app.get('/', function(req, res){
    //check user session value, is logged in 
    if(req.user)
        res.render('menu_log.ejs', function(err, html){

            var data = {
                title: 'Home',
                menu: html
                //req.user['Prenom'] -- à afficher
            };
            res.render('index.ejs', data);

            console.log("index logué");
        });
    else
        res.render('menu_nolog.ejs', function(err, html){

            var data = {
                title: 'Home',
                menu: html
            };
            res.render('index.ejs', data);

            console.log("index PAS logué");
        });
});

// Passport's authentication
app.post('/login',
    passport.authenticate('local', { successRedirect: '/',
                                   successFlash: 'Bienvenue !',
                                   failureRedirect: '/wrong',
                                   failureFlash: "Email ou mot de passe incorrect." })
);

app.get('/logout', function(req, res){

    req.logout();
    res.redirect('/');
})

.get('/inscription', function(req, res){

    res.render('menu_nolog.ejs', function(err, html){

        var data = {
            title: 'Register',
            menu: html
        };

        res.render('inscription.ejs', data);
    });
});

http.createServer(app).listen(app.get('port'), function () {
    console.log('Express server listening on port ' + app.get('port'));
});

Upvotes: 1

Views: 1371

Answers (1)

robertklep
robertklep

Reputation: 203286

LocalStrategy requires two parameters (either passed as POST data, or in a query string) to exist: username and password. If you're not passing those two, Passport doesn't even bother to call the strategy handler.

The field names are configurable by passing an object as first argument to the LocalStrategy constructor:

passport.use(new LocalStrategy({
  usernameField : 'username',
  passwordField : 'password'
}, function(username, password, done) { ... }));

Upvotes: 1

Related Questions