Search code examples
expresspassport.jsconnect-flash

Display flash messages with Passport.js


I'm having trouble displaying flash messages while using Passport.js in Express 4. The Passport.js local strategy documentation shows how to set the flash message, but not much about how to actually display it.

Here's how I've been doing it.

passport.use(new auth(function (username, password, done) {
    con.query(query.login, [username], function(err, rows) {
        if (err) {
            done(err);
        }
        if (rows.length != 1) {
            console.log('Login attempted for ' + username);
            return done(null, false, {message: "Wrong username/password"});
        }
        user = rows[0];
        bcrypt.compare(password, user.passwordHash, function (err, correct) {
            delete user.passwordHash;
            if (correct) {
                return done(null, user);
            } else {
                console.log('Login attempted for ' + username);
                return done(null, false, {message: "Wrong username/password"});
            }
        })
    });
}));

app.get('/login', function(req, res) {
    var pageParameters = {};
    var flash = req.flash('message');
    // console.log(flash);
    if (flash != null && flash != '') {
        pageParameters.message = flash;
    }
    res.render('login', pageParameters);
});

app.post('/login', passport.authenticate('local', {
    failureRedirect: '/login',
    failureFlash: true
}), function (req, res) {
    req.session.user = req.user;
    if (typeof req.session.redirect !== 'undefined') {
        res.redirect(req.session.redirect);
        delete req.session.redirect;
    } else {
        res.redirect('/');
    }
});

There's no error, the console isn't telling me anything about the flash being undefined. console.log(flash) shows nothing. How do display the flash?


Solution

  • Working project see hire

    var express = require('express');
    var router = express.Router();
    
    var isAuthenticated = function (req, res, next) {
        // if user is authenticated in the session, call the next() to call the next request handler 
        // Passport adds this method to request object. A middleware is allowed to add properties to
        // request and response objects
        if (req.isAuthenticated())
            return next();
        // if the user is not authenticated then redirect him to the login page
        res.redirect('/');
    }
    
    module.exports = function(passport){
    
        /* GET login page. */
        router.get('/', function(req, res) {
            // Display the Login page with any flash message, if any
            res.render('index', { message: req.flash('message') });
        });
    
        /* Handle Login POST */
        router.post('/login', passport.authenticate('login', {
            successRedirect: '/home',
            failureRedirect: '/',
            failureFlash : true  
        }));
    
        /* GET Registration Page */
        router.get('/signup', function(req, res){
            res.render('register',{message: req.flash('message')});
        });
    
        /* Handle Registration POST */
        router.post('/signup', passport.authenticate('signup', {
            successRedirect: '/home',
            failureRedirect: '/signup',
            failureFlash : true  
        }));
    
        /* GET Home Page */
        router.get('/home*', isAuthenticated, function(req, res){
    //      console.log("get home :" + req.session.cookie.name);
            res.render('home', { user: req.user });
        });
    
        /* Handle Logout */
        router.get('/signout', function(req, res) {
            req.logout();
            res.redirect('/');
        });
    
        return router;
    }