使用passport-facebook策略和passport-local无法将用户序列化到会话中

我在sails.js使用passport-localpassport-facebook策略进行身份validation。 使用电子邮件validation工作正常。 但是,当用户使用Facebook进行身份validation时,出现此错误消息[Error: Failed to serialize user into session]

然后我testing了serializeUser方法,事实certificate, user参数在facebook的情况下是空的。 虽然我也试着看看verifyHandler是否被调用,而不是被调用。

这是我的Facebook身份validation操作代码:

 facebook: function (req, res) { passport.authenticate('facebook', {failureRedirect: '/login', scope: ['email']}, function (err, user) { if ((err) || (!user)) { req.session.flash = { errMsg: 'Email or password mismatch.' } return res.redirect('/login'); } req.logIn(user, function (err) { if (err) { console.log(err); res.view('500'); return; } res.redirect('/'); return; }); })(req, res); } 

这是passport.js服务的代码(api / services / passport.js)

 var passport = require('passport'), LocalStrategy = require('passport-local').Strategy, FacebookStrategy = require('passport-facebook').Strategy, bcrypt = require('bcrypt'); var verifyHandler = function (token, tokenSecret, profile, done) { console.log('in verifyHandler'); // this line is not being executed. console.log(profile); process.nextTick(function () { User.findOne({uid: profile.id}, function (err, user) { if (err) { return done(err); } if (user) { return done(null, user); } else { var data = { provider: profile.provider, uid: profile.id, name: profile.displayName }; if (profile.emails && profile.emails[0] && profile.emails[0].value) { data.email = profile.emails[0].value; } User.create(data, function (err, user) { return done(err, user); }); } }); }); }; passport.serializeUser(function (user, done) { done(null, user.id); }); passport.deserializeUser(function (id, done) { User.findById(id, function (err, user) { done(err, user); }); }); passport.use(new LocalStrategy({ usernameField: 'email', passwordField: 'password' }, function (email, password, done) { User.findOne({email: email}).exec(function (err, user) { if (err) { return done(err); } if (!user) { return done(null, false, {message: 'Unknown user ' + email}); } bcrypt.compare(password, user.password, function (err, res) { if (!res) return done(null, false, {message: 'Invalid Password'}); return done(null, user); }); }); } )); passport.use(new FacebookStrategy({ clientID: sails.config.facebook.clientID, clientSecret: sails.config.facebook.clientSecret, callbackURL: sails.config.facebook.callbackURL }, verifyHandler)); 

最后(config / passport.js)

 var passport = require('passport'), LocalStrategy = require('passport-local').Strategy, FacebookStrategy = require('passport-facebook').Strategy; module.exports = { http: { customMiddleware: function (app) { app.use(passport.initialize()); app.use(passport.session()); } } }; 

有什么想法吗?

检查是否定义了user.id,它是string,但不是ObjectId()。

 passport.serializeUser(function (user, done) { done(null, user.id); });