2

我在sails.js中使用passport-localpassport-facebook验证策略。使用电子邮件进行身份验证正常。但是,当用户使用Facebook进行身份验证时,我收到此错误消息[Error: Failed to serialize user into session]使用passport-facebook策略与本地护照无法序列化用户到会话中

然后我测试了serializeUser方法,结果发现user param在facebook的情况下是空的。虽然我也试图看看verifyHandler是否被调用,它不被调用。

这里是我的Facebook的身份验证操作代码:

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 /服务/ 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)); 

最后的代码(配置/ 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()); 
    } 
    } 
}; 

有什么想法?

回答

0

检查user.id是否定义,它是字符串,但不是ObjectId()。

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

相关问题