Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

passport.initialize() middleware not in use for express 4.10 for custom callback

can anyone please help me with this. I keep getting Error: passport.initialize() middleware not in use when i try connecting to a user that is in the database. Exception cases work just fine (e.i incorrect password/username not found).

Here is the setup:

versions i am using

// version
node --version v0.10.33
[email protected]
[email protected]
[email protected]

server.js code is here

// server.js
'use strict';
var express = require('express');
var bodyParser = require('body-parser');
var session = require('express-session');
var passport = require('passport');
var flash = require('connect-flash');
var cookieParser = require('cookie-parser');

//Our custom modules
var mysqlc = require('./modules/mysql_client');

// Our custom apps
var app = express();

//view engine setup
app.set('env', process.env.NODE_ENV);
console.log('Running as environment: ' + app.get('env'));
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(favicon(path.join(__dirname,'./public/favicon.ico')));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use('/rootpath', express.static(path.join(__dirname,'./public')));

// use session/cookie for auth
app.use(cookieParser());
app.use(session({ 
    secret: 'clinksecret',  // TODO: STORE outside
    saveUninitialized: true,
    resave: true
}));

// use connect-flash for flash messages stored in session
app.use(flash());

var server = require('http').Server(app);
var io = require('socket.io')(server);

/**
 * Connect to all servers 1st
 * */

// mysqlc connection setup
var connPropMySqlC = {
        connectionLimit : 10,
        host            : config.settings.auth.clink.host,
        user            : config.settings.auth.clink['user'],
        password        : config.settings.auth.clink['password'],
        database        : config.settings.auth.clink.database
};
var mydbc = new mysqlc.MySqlClient(connPropMySqlC);
mydbc.connect(function (err) {
    if (err) {
        console.error('server-mdbc-connect-ERROR:', err);
        throw err;
    }
});

//authentication with session after connection to mydbc
var passport = require('./modules/auth')({mydbc:mydbc, io:io, app:app, passport:passport});
app.use(passport.initialize());
app.use(passport.session());

/*
 * routers
 * */
var testapp = require('./testapp/app')({mydbc:mydbc, io:io});
app.use('/testapp', testapp);

auth.js (all the passport configs)

// auth.js
/**
 * for user authentication using passport
 */
var LocalStrategy = require('passport-local').Strategy;
var bcrypt   = require('bcrypt-nodejs');

//Variables local to module
var io;
var mydbc;
var app;
var passport;

function validPassword(val, hash, callback) {
    return bcrypt.compare(val, hash, callback);
}

function exportModFunc(args) {
    /**
     * used to passing object across modules
     * @param {object} args: args = {mydbc, io} // where mydbc mysqlc.MySqlClient object
     * @return {object} passport
     */
    mydbc = args.mydbc; // update variable
    io = args.io;       // update variable
    app = args.app;    // update variable
    passport = args.passport;   // update variable

    // route middleware
    passport.use('local-login', new LocalStrategy({
        usernameField : 'formLogin_user',
        passwordField : 'formLogin_password',
        passReqToCallback : true // allows us to pass back the entire request to the callback
    },
    function(req, username, password, done) {
        mydbc.getUser({'username':username}, function(err, user) {
            console.log('test-local-login', username, password, done, err, user)
            if (err)
                return done(err);

            // if no user is found, return the message
            if (!user)
                return done(null, false, req.flash('loginMessage', 'No user found.')); // req.flash is the way to set flashdata using connect-flash

            // if the user is found but the password is wrong
            validPassword(password, user.password, function(err, res) {
                if (err)
                    return done(err);

                if (!res) {
                    return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); // create the loginMessage and save it to session as flashdata
                } else {
                    // all is well, return successful user
                    return done(null, user);
                }
            });
        });
    }));

    passport.serializeUser(function(user, done) {
        /**
         * each session will serialize to userid
         * http://passportjs.org/guide/configure/
         * @param {object} user: same as object as returned by mydbc.getUser()
         * @return {null} null
         */
        done(null, user.userid);
    });

    passport.deserializeUser(function(userid, done) {
        /**
         * each session will deserialize to user
         * http://passportjs.org/guide/configure/
         * @param {int} userid: same as mydbc.getUser().userid
         * @return {null} null
         */
        mydbc.getUser({'userid':userid}, function(err, user) {
            done(null, user);
        });
    });

    // route post request
    //// process the login form
    app.post('/authLogin/', function(req, res, next) {
        passport.authenticate('local-login', function(err, user, info) {
            if (err) { return next(err); }
            var errors = {};
            var loginMsg = req.flash('loginMessage');
            if (loginMsg.length !== 0 || (!user)) {
                errors.loginMsg = loginMsg;
                return res.json({
                    errors: errors
                });
            }
            console.log('test-authLogin-local-login', err, user, info);
            req.logIn(user, {failureFlash: true}, function(err) {
                if (err) { return next(err); }
                return res.redirect('/users/' + user.username);
            });
        })(req, res, next);
    });

    return passport;
};

module.exports = exportModFunc;
like image 402
amulllb Avatar asked Apr 13 '15 08:04

amulllb


People also ask

What is Passport initialize ()?

The passport. initialize() middleware is executed on every request. It finds the id in the session, and then the deserializeUser is called. During deserialization the user information is loaded to the request through req. user .

What does Passport authenticate () do?

In this route, passport. authenticate() is middleware which will authenticate the request. By default, when authentication succeeds, the req. user property is set to the authenticated user, a login session is established, and the next function in the stack is called.

What is Passport used for in node JS?

Passport is Express-compatible authentication middleware for Node. js. Passport's sole purpose is to authenticate requests, which it does through an extensible set of plugins known as strategies.

Why is Passport JS required?

Passport is authentication middleware for Node. js. As it's extremely flexible and modular, Passport can be unobtrusively dropped into any Express-based web application. A comprehensive set of strategies supports authentication using a username and password, Facebook, Twitter, and more.


1 Answers

You should initialize passport before adding it to your route middleware: http://passportjs.org/guide/configure/

app.use(passport.initialize());
app.use(passport.session());

//authentication with session after connection to mydbc
var passport = require('./modules/auth')({mydbc:mydbc, io:io, app:app, passport:passport});

You are also redefining your passport var in server.js which is unnecessary.

like image 81
olan Avatar answered Oct 29 '22 16:10

olan