passportjs中使用的策略之一不返回用户对象

时间:2017-06-15 20:54:08

标签: node.js mongodb express passport.js

所以我尝试使用passportjs在我的nodejs / express app中实现多个本地策略。我跟着this questionthis issue,但出于某种原因我在第二个策略后使用req.user时它不存在。即使找到用户(在我的情况下是'孩子')的过程也是正确完成的。 所以这是我的passportjs配置文件:

const LocalStrategy = require('passport-local').Strategy;
const User = require('../models/user');
const Child = require('../models/child');
const config = require('../config/database');
const bcrypt = require('bcryptjs');

module.exports = function(passport){
  // Local Strategy
    passport.use('user', new LocalStrategy(function(username, password, done){
        // Match Username
        let query = {username:username};
        User.findOne(query, function(err, user){
            if(err) throw err;
            if(!user){
                return done(null, false, {message: 'No user found'});
            }

            // Match Password
            bcrypt.compare(password, user.password, function(err, isMatch){
                if(err) throw err;
                if(isMatch){
                    return done(null, user);
                } else {
                    return done(null, false, {message: 'Wrong password'});
                }
            });
        });
    }));

    passport.use('child', new LocalStrategy(function(username, password, done){
        // Match Username
        let query = {login:username};
        Child.findOne(query, function(err, user){
            if(err) throw err;
            if(!user){
                return done(null, false, {message: 'No user found1'});
            }

            // Match Password
            bcrypt.compare(password, user.password, function(err, isMatch){
                if(err) throw err;
                if(isMatch){
                    return done(null, user);
                } else {
                    return done(null, false, {message: 'Wrong password'});
                }
            });
        });
    }));

  passport.serializeUser(function(user, done) {
      var key;
      if(user instanceof User) {
          key = {
              id: user.id,
              type: 1
          }
      } else if (user instanceof Child) {
          key = {
              id: user.id,
              type: 2
          }
      }
    done(null, key);
  });

  passport.deserializeUser(function(key, done) {
      if(key.type === 1){
          User.findById(id, function(err, user) {
              done(err, user);
          });
      } else if (key.type === 2){
          Child.findById(id, function(err, user) {
              done(err, user);
          });
      }
  });
}

这是我使用策略的帖子路线:

router.post('/login',
  passport.authenticate('user', {successRedirect: '/dashboard', failureRedirect: '/', failureFlash: true}),
  function(req, res) {
    res.redirect('/dashboard');
  });

router.post('/childlogin',
  passport.authenticate('child', {successRedirect: '/childDashboard', failureRedirect: '/', failureFlash: true}),
  function(req, res) {
    res.redirect('/childDashboard');
  });

由于某些原因,当我以用户身份登录时,一切正常。我可以从/ dashboard访问req.user。但是当我尝试登录时,孩子req.user未定。尽管战略正在发挥作用。我知道它正在工作,因为如果我在孩子的策略中的“return done(null,user)”之前做“console.log(user)”,我会得到关于正确对象的完整信息。看来对象不会在app中推送和定义。有谁知道我可能做错了什么?我对nodejs / express很新,所以如果它是愚蠢的话,我不会感到惊讶。

0 个答案:

没有答案