【问题标题】:Passport "Error: Failed to serialize user into session" for multiple models多个模型的护照“错误:无法将用户序列化到会话中”
【发布时间】:2017-10-28 19:15:36
【问题描述】:

我有两种可以登录的模型(都不是用户)一种是申请人,另一种是雇主。 passportEmployer 配置文件就是这个,类似于 passportApplicant 配置文件。

var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var Employer = require('../controllers/EmployerController');

//passport middleware
passport.serializeUser(function(employer, done) {
    done(null, employer._id);
});

passport.deserializeUser(function(id, done) {
    Employer.findById(id, function (err, employer) {
        done(err, employer);
    });
});

//passport local strategy
passport.use( 'employer', new LocalStrategy({usernameField: 'email',
    passwordField: 'password',
    session: false
  },
    function(username, password, done){

        Employer.find({email:username}, function(err, employers){
            if(err) {
                return done(err, null, null);
            }

            var employer = employers[0];
            if(!employer){
                return done(null, false, { 'confirmation':'fail', message: 'Unknown Employer'});
            }

            Employer.comparePassword(password, employer.password, function(err, isMatch){
                if(err) {
                    return done(err, null, null);
                }
                else if(isMatch){
                    return done(null, Employer, {'confirmation':'success', 'result':employer});
                }else{
                    return done(null, false, {'confirmation':'fail', message: 'Invalid Password'});
                }
            });
        });
    }
));

module.exports = passport;

以及以下登录路径:

router.post('/employer/login', function(req, res, next){
    employerPassport.authenticate('employer', function(err, employer, info){
        if(err) {
            res.status(400).json({'confirmation':'fail', 'message':err})        
        }
        else if(!employer){
            res.status(400).json(info)
        }
        else{
            req.login(employer, function(err){  
                if(err){
                    res.status(400).json({'confirmation':'fail', 'message':'error'+err})
                }else{
                    console.log('Authentication Successful');
                    res.json(info)  
                }
            });
        }
    })(req, res, next);
});

但这会产生以下错误: "message": "errorError: 无法将用户序列化到会话中"

请帮忙。

【问题讨论】:

    标签: node.js session express passport.js


    【解决方案1】:

    将您的本地策略与以下策略进行比较。您的代码中有错字。另外,使用Employer.findOne() 而不是Employer.find() 查询单个雇主

    //passport local strategy
    
      passport.use( 'employer', new LocalStrategy({usernameField: 'email',
       passwordField: 'password',
       session: false
      },
       function(username, password, done){
    
        Employer.findOne({email:username}, function(err, employer){
            if(err) {
                return done(err, null, null);
            }
            if(!employer){
                return done(null, false, { 'confirmation':'fail', message: 'Unknown Employer'});
            }
    
            Employer.comparePassword(password, employer.password, function(err, isMatch){
                if(err) {
                    return done(err, null, null);
                }
                else if(isMatch){
                    return done(null, employer, {'confirmation':'success', 'result':employer});
                }else{
                    return done(null, false, {'confirmation':'fail', message: 'Invalid Password'});
                }
            });
        });
    }
    ));
    

    【讨论】:

      猜你喜欢
      • 2019-03-26
      • 2017-07-15
      • 2021-03-14
      • 2015-06-17
      • 2013-11-25
      • 1970-01-01
      • 1970-01-01
      • 2018-10-22
      • 2012-09-19
      相关资源
      最近更新 更多