护照正确验证一次,然后isAuthenticated返回false

时间:2018-08-08 00:30:06

标签: node.js session cookies mongoose passport.js

我正在使用MongoDB,并且在我的数据库中有两个集合-用户和角色模型。

这个想法是用户和角色模型是独立的模式-我需要它们分开。我设法成功地“注册”了一个新的用户和角色模型,但是在登录时,只有其中一个可以登录。即如果第一次登录是由用户完成的,则只有用户可以登录-角色模型在登录时获得成功消息,但是req.isAuthenticated始终为他们返回false。

知道为什么吗? -我在扯头发试图解决这个问题!

登录路径:

router.post('/login', function(req, res, next) {

// my work to see if account belongs to rolemodel or user
if (RoleModel) {
  passport.use(new LocalStrategy(
    function(username, password, done) {
      RoleModel.getUserByUsername(username, function(err, user) {
        if (err) throw err;
        if (!user) {
          return done(null, false);
        }

        RoleModel.comparePassword(password, user.password, function(err, isMatch) {
          if (err) throw err;
          if (isMatch) {
            return done(null, user);
          } else {
            return done(null, false);
          }
        });
      });
    }));

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

  passport.deserializeUser(function(id, done) {
    RoleModel.getUserById(id, function(err, user) {
      done(err, user);
    });
  });
  passport.authenticate('local', function(err, user, info) {
    req.login(user, function(err) {
      if (err) {
        console.log(err)
      } else {
        console.log('success')
      }
    });
  })(req, res, next);
} else {
  // must be user
  passport.use(new LocalStrategy(
    function(username, password, done) {
      User.getUserByUsername(username, function(err, user) {
        if (err) throw err;
        if (!user) {
          return done(null, false);
        }

        User.comparePassword(password, user.password, function(err, isMatch) {
          if (err) throw err;
          if (isMatch) {
            return done(null, user);
          } else {
            return done(null, false);
          }
        });
      });
    }));

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

  passport.deserializeUser(function(id, done) {
    User.getUserById(id, function(err, user) {
      done(err, user);
    });
  });
  passport.authenticate('local', function(err, user, info) {
    req.login(user, function(err) {
      if (err) {
        console.log(err)
      } else {
        console.log('success')
      }
    });
  })(req, res, next);
}
});

我知道我两次进行相同的调用,但是它们只被调用一次-可以查看rolemodel集合或用户集合。我是mongo的新手,想知道这是否是正确的方法吗?

要澄清-如果启动应用程序时我首先以角色模型身份登录,则一切正常。如果我以角色模型身份注销,然后尝试以其他角色模型身份登录,那么一切都很好。但是,当我以角色模型登录后尝试以用户身份登录时,我会收到正确的身份验证消息,但req.isAuthenticated为false。

我做了一些深入的研究:

尝试访问经过身份验证的路由时,

用户返回请求(首次登录,对所有用户成功):

      headers: 
   { 'cache-control': 'no-cache',
     'postman-token': '5128e768-7385-4c8d-8833-d1db7b9e709a',
     'user-agent': 'PostmanRuntime/7.1.1',
     accept: '*/*',
     cookie: 'connect.sid=s%3A6dmDciE6LlmK4_MmiiEfU4PYxNy81Nre.O6zEMBnDD4QD6LORYo4l2cKLy9GEyvBBwkHGbBhcUEE',
     connection: 'keep-alive' },
  sessionStore: 
   MemoryStore {
     sessions: { '6dmDciE6LlmK4_MmiiEfU4PYxNy81Nre': '{"cookie":{"originalMaxAge":null,"expires":null,"secure":false,"httpOnly":true,"path":"/"},"passport":{"user":"5b6a2a597523fd8fd711ce20"}}' },
  sessionID: '6dmDciE6LlmK4_MmiiEfU4PYxNy81Nre',
   Session {
     cookie: 
      { path: '/',
        _expires: null,
        originalMaxAge: null,
        httpOnly: true,
        secure: false },
     passport: { user: '5b6a2a597523fd8fd711ce20' } },
  _passport: 
   { instance: 
      Authenticator {
        _key: 'passport',
     session: { user: '5b6a2a597523fd8fd711ce20' } },
  user: 
   { _id: 5b6a2a597523fd8fd711ce20,

尝试访问经过身份验证的路由时,rolemodel返回要求(用户已注销,而不是rolemodel想要登录):

      headers: 
   { 'cache-control': 'no-cache',
     'postman-token': '8aea8381-c81a-4100-b42d-ea2aca5083ed',
     'user-agent': 'PostmanRuntime/7.1.1',
     accept: '*/*',
     cookie: 'connect.sid=s%3A6dmDciE6LlmK4_MmiiEfU4PYxNy81Nre.O6zEMBnDD4QD6LORYo4l2cKLy9GEyvBBwkHGbBhcUEE',
     connection: 'keep-alive' },
  sessionStore: 
   MemoryStore {
     sessions: { '6dmDciE6LlmK4_MmiiEfU4PYxNy81Nre': '{"cookie":{"originalMaxAge":null,"expires":null,"secure":false,"httpOnly":true,"path":"/"},"passport":{"user":"5b6a2a4f7523fd8fd711ce1f"}}' },
  sessionID: '6dmDciE6LlmK4_MmiiEfU4PYxNy81Nre',
  session: 
   Session {
     cookie: 
      { path: '/',
        _expires: null,
        originalMaxAge: null,
        httpOnly: true,
        secure: false },
     passport: {} },
  _passport: 
   { instance: 
      Authenticator {
        _key: 'passport',
     session: {} },

一个会话,另一个会话没有-但是为什么以及如何解决此问题?帮助或提示将不胜感激-在与这个斗争了将近一个星期后,我现在毫无头绪:(

0 个答案:

没有答案