PassportJS本地策略不工作Withh MongoDB

我试图得到与PassportJS用户身份validation的处理,我不能让我的数据库设置工作。

我在没有 Mongoose的情况下使用MongoDB,我无法使LocalStrategy模块工作。

希望我的数据库查询不是太麻烦阅读。

本地策略:

passport.use(new LocalStrategy( function(username, password, done) { //Fire up database mongo.connect("mongodb://localhost:27017/formulas", function(e, db) { if (e) {return next(e);} var col = db.collection("users"); //Do a database query to find a record by username col.findOne({"username": username}, function(err, user){ if (err) { return done(err);} if(!user) { return done(null, false, { message: "Please check your log in credentials." }); } //if it exists call done() object with user information bcrypt.compare(password, user.password, function(err, res){ if (err) throw err; if (res == true) { return done(null, {username: username, password: password}); } else { return done(null, false, { message: "Invalid password."}); } }); }); }); })); 

我调用passport.authenticate()像这样:

 router.post('/login', passport.authenticate('local', {successRedirect:'/', failureRedirect:'/about',failureFlash: false}), function(req, res){ console.log(req.body); console.log(req.user); console.log("The user was logged"); }); 

SerializeUserdeserializeUser SerializeUser看起来像这样:

 passport.serializeUser(function(user, done) { done(null, user.username); }); passport.deserializeUser(function(id, done) { mongo.connect("mongodb://localhost:27017/formulas", function(e, db){ if (e) {return next(e);} var col = db.collection("users"); col.findOne({"username": id}, function(err, user){ done(err, {"username": id}); }); }); }); 

当我打电话给app.post(/login)我被直接带到/about ,没有任何东西被logging到控制台,所以我不太清楚发生了什么事情。

build议如何解决或如何排除故障非常感谢。

首先当你序列化用户对象,然后在反序列化也整个用户对象必须通过。 考虑下面的例子。

对于路线:

 router.post('/login', function(req, res, next) { passport.authenticate('local', function(err, user, info) { if (err) { return next(err); } if (!user) { return res.redirect('/login'); } req.logIn(user, function(err) { if (err) { return next(err); } req.session.user = req.user; return res.redirect('/home'); }); })(req, res, next); }); 

对于passport.js,将本地策略和护照放在同一个文件夹中

 var passport = require('passport'), session = require('express-session'); var local = require('./localstrategy.js'); module.exports = function (app) { app.use(session({ secret: 'Site visit', resave: true, saveUninitialized: true, cookie: { secure: false } })); app.use(passport.initialize()); app.use(passport.session()); passport.serializeUser(function(user, done){ done(null, user); }); passport.deserializeUser(function(user, done){ done(null, user); }); local(); }; 

对于本地策略:

 'use strict'; var passport = require('passport'), local = require('passport-local').Strategy; var user; // path where the db.js is placed var db = require('./../db.js'); var ObjectId = db.getObjectID(); var bcrypt = require('bcrypt'); module.exports = function(){ passport.use(new local({ usernameField : 'username', passwordField : 'password' }, function(username, password, done){ var collection = db.getDb().collection('users'); collection.findOne({ username: username, }, function (err, result) { if(result == null){ cb(null, false); }else { bcrypt.compare(password, result.password, function (err, passRes) { if (passRes == true) { user = user; done(err, user); }else{ done(null, false, { message : 'Invalid Password'}); } }); } }); })); };