2015-04-13 29 views
5

bất kỳ ai cũng có thể giúp tôi với điều này. Tôi tiếp tục nhận được Error: passport.initialize() middleware not in use khi tôi thử kết nối với người dùng có trong cơ sở dữ liệu. Các trường hợp ngoại lệ hoạt động tốt (không tìm thấy mật khẩu/tên người dùng không chính xác).passport.initialize() middleware không được sử dụng để thể hiện 4.10 cho gọi lại tùy chỉnh

Đây là thiết lập:

phiên bản tôi đang sử dụng

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

đang server.js là ở đây

// 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 (tất cả các configs hộ chiếu)

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

Trả lời

19

Bạn nên khởi tạo hộ chiếu ze trước khi thêm nó vào trung lộ trình của bạn: 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}); 

Bạn cũng đang đánh giá lại var hộ chiếu của bạn trong server.js đó là không cần thiết.

+0

cảm ơn bạn rất nhiều :) – abarik

Các vấn đề liên quan