node.js - passport.initialize() 中间件未用于 express 4.10 的自定义回调

标签 node.js express passport.js passport-local

谁能帮我解决这个问题。当我尝试连接到数据库中的用户时,我一直收到 Error: passport.initialize() middleware not in use 错误。异常(exception)情况工作得很好(例如,我找不到不正确的密码/用户名)。

这是设置:

我正在使用的版本

// version
node --version v0.10.33
express@4.10.2
passport@0.2.1
passport-local@1.0.0

server.js 代码在这里

// 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(所有 Passport 配置)

// 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;

最佳答案

你应该在将它添加到你的路由中间件之前初始化 Passport :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});

您还在 server.js 中重新定义了您的 Passport var,这是不必要的。

关于node.js - passport.initialize() 中间件未用于 express 4.10 的自定义回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29600759/

相关文章:

node.js - Windows - 错误 : Could not locate the bindings file

javascript - 使用 ng-file-upload 指令将文件上传到 sails.js 服务器

node.js - 查找 Express 应用的热门搜索

node.js - 将多个第三方和本地帐户与 Passport 链接在一起

javascript - 将express/mongodb/websockets项目迁移到什么?

javascript - 如何使用 ES6 和 Node Js 删除 txt 文件中的重复项?

node.js - 调用 "then"时 Promise 挂起

javascript - 我的 req.params.id 未定义。我该如何修复我的路线以使其正常工作

javascript - 将 View 渲染为 HTML

javascript - 具有不同配置的相同 Passport js 策略 (SAML)