2015-12-17 30 views
0

我想弄清楚我在這裏做錯了什麼。在查看文檔(這是令人傷心的過時)並搜索網頁後,我相信我已經正確配置了護照的所有內容,但由於某種原因,serializeUser和deserializeUser都沒有被調用,導致req.user永遠不會被設置。passportJS serializeUser和反序列化用戶從來沒有叫

好了,所以這裏是我的根server.js文件(總結)

/** 
* Module dependencies 
*/ 

var express = require('express'), 
    app = module.exports = express(), 
    bodyParser = require('body-parser'), 
    cookieParser = require('cookie-parser'), 
    env = process.env.NODE_ENV || 'development', 
    errorHandler = require('errorhandler'), 
    http = require('http'), 
    methodOverride = require('method-override'), 
    morgan = require('morgan'), 
    passport = require('passport'), 
    path = require('path'), 
    routes = require('./server/routes/index'), 
    secret = process.env.SESSION_SECRET, 
    session = require('express-session'), 
    FileStore = require('session-file-store')(session); 

/** 
* Configuration 
*/ 

// all environments 
app.set('http-port', process.env.PORT || 3000); 
app.set('views', __dirname + '/public'); 
app.engine('.html', require('ejs').renderFile); 
app.use(morgan('dev')); 
app.use(methodOverride()); 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use(cookieParser(secret)); 
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(bodyParser.json()); 

// development enviornment only 
if (env === 'development') { 
    app.use(session({ 
    cookie: { maxAge: (60 * 60 * 10) }, // User session will expire after 60  minutes. 
    resave: false, 
    saveUninitialized: false, 
    secret: secret, 
    })); 
    app.use(errorHandler()); 
} 

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

/** 
* Routes 
*/ 

routes.SESSION_SECRET = secret; // Set env var for the router; 
app.use('/', routes); // Handle defined routes 
app.get('/', routes.index); // Serve index 
app.get('*', routes.index); // Redirect all others to the index (HTML5 history) 

/** 
* Start Server 
*/ 

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

你會發現這條線以上:

routes = require('./server/routes/index'), 

這裏是路線文件(總結):

var express = require('express'); 
var router = express.Router(); 
var auth = require('./modules/auth'); 

// AUTH ROUTES 
router.post('/login', auth.login); // Log a local user into the application  using passport 
router.post('/ldap-login', auth.ldapLogin); // Log a LDAP user into the  application using passport 
router.get('/logout', auth.logout); // Log the current user out of the system 
router.get('/isLoggedIn', auth.isLoggedIn); // Check is the user is logged in 
router.post('/updatePassword', auth.updatePassword); // Updates a users password 

同樣你會注意到這個參考:

var auth = require('./modules/auth'); 

這裏是auth模塊(總結)。

'use strict' 
var passport = require('passport'); 
var secret = process.env.SESSION_SECRET; 
var crypto = require('../../crypto'); 
var models = require('../../models'); 
var User = models.User; 

require('../../passport'); 

// Log a local user into the application using passport 
exports.login = function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if(err) { return next(err); } 

    if(user) { 
     User.find({ 
     where: { 
      email: user.email 
     } 
     }) 
     .then(function(currentUser) { 
     if(currentUser) { 
      currentUser.updateAttributes({ 
      last_login: new Date() 
      }); 
     } 
     }); 
     user.email = crypto.decrypt(user.email); 
     user.first_name = crypto.decrypt(user.first_name); 
     user.last_name = crypto.decrypt(user.last_name); 
     return res.json({ token: user.generateJWT(secret) }); 
    } else { 
     return res.status(401).json(info); 
    } 
    })(req, res, next); 
} 

在那個文件中我引用了我的護照配置,其中包含我期望命中的函數。

require('../../passport'); 

這是在那裏引用的護照配置(總結)。

(function() { 
    var models = require('./models'); 
    var User = models.User; 

    /** 
    * Passport authentication 
    */ 
    var passport = require('passport'); 

    // Passport Local Strategy 
    var locStrategy = require('passport-local').Strategy; 

    passport.use(new locStrategy({ 
     usernameField: 'username' 
    }, 
    function(username, password, done) { 
     User.find({ 
     where: { 
      username: username 
     } 
     }) 
     .then(function(user) { 
     if(!user) { 
      console.log('No such user found'); 
      return done(null, false); 
     } 
     user.verifyPassword(password, function(err, isMatch) { 
      if(err) { 
      console.log('Error checking password. Error: ' + err); 
      return done(err); 
      } else if(!isMatch) { 
      // Password did not match 
      console.log('Passwords did not match'); 
      return done(null, false); 
      } else { 
      // Success 
      console.log('User logged in'); 
      return done(null, user); 
      } 
     });  
     }) 
     .catch(function(err) { 
     console.log('Error logging user in. Message: ' + err); 
     return done(err); 
     }); 
    } 
)); 

    passport.serializeUser(function(user, done) { 
    console.log('serializeUser'); // I expect this to be logged 
    done(null, user); 
    }); 

    passport.deserializeUser(function(user, done) { 
    console.log('deserializeUser'); // I expect this to be logged 
    done(null, user); 
    }); 

    exports.isAuthenticated = passport.authenticate(['local', 'ldapauth']); 
})(); 

你會注意到那裏的用戶模型的引用,但因爲工作正常,我不會包括任何代碼。

我不知道這裏有什麼問題阻止我點擊上面的passport.serializeUser和passport.deserializeUser方法。我想我可能需要將這些方法包含在server.js根目錄中,因此我嘗試在會話({})配置和passport.session()調用之後移動方法,並且這兩個方法都沒有任何影響。

回答

2

發現問題,希望我可以幫助別人。

要調用deserializeUser,您需要在passport.authenticate()解析後手動調用req.login()。我沒有做過的事情,由於護照文檔中,它說:

"Note: passport.authenticate() middleware invokes req.login() automatically." 

至少對我來說聽起來像護照應該調用登錄,進而deserializeUser automaticaly當你調用passport.authenticate(),但是這是不正確。

這裏是從上面我的身份驗證模塊更新的代碼:

exports.login = function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if(err) { return next(err); } 

    if(user) { 
     User.find({ 
     where: { 
      email: user.email 
     } 
     }) 
     .then(function(currentUser) { 
     if(currentUser) { 
      currentUser.updateAttributes({ 
      last_login: new Date() 
      }) 
     } 
     }); 
     user.email = crypto.decrypt(user.email); 
     user.first_name = crypto.decrypt(user.first_name); 
     user.last_name = crypto.decrypt(user.last_name); 
     req.login(user, function(err) { // I added req.login() here and now deserializeUser is being called and req.user is being set correctly. 
     if(err) { 
      return res.status(401).json(err); 
     } else { 
      return res.json({ token: user.generateJWT(secret) }); 
     } 
     }); 
    } else { 
     return res.status(401).json(info); 
    } 
    })(req, res, next); 
}