0

我正在使用带有 Express 框架的 Node.js 开发应用程序,使用 Passport 进行用户身份验证,使用 MongoDB 进行存储。我无法弄清楚为什么无论哪个用户尝试登录,服务器都认为登录用户是数据库中的第一个用户,即第一个注册的用户。

当服务器接收到 /login 的 post 请求时,它会运行 passport.authenticate 来验证用户的凭据。从注销到控制台,很明显传递了正确的用户凭据,甚至会话 ID 也是正确的,但是无论在哪里设置 req.user,它都被设置为错误的用户。

这是控制台中发生的事情的日志,可以为您提供一些想法:

get /user
--req.user is { salt: '$2a$10$NgPcBpvUqGq32IoWvsChd.',
  hash: '$2a$10$NgPcBpvUqGq32IoWvsChd.SYva2e/aaPsfUcdN65aRm/D1oYJB3Ty',
  username: 'daniel',
  email: 'dan@dan.com',
  _id: 515decd49fc3204ca1000001,
  __v: 0,
  songs: [] }
--req.session is { cookie:
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true },
  passport: { user: '515decdc9fc3204ca1000002' },
  flash: {} }

如您所见,用户 id 在 req.sessions 中是正确的,但在 req.user 中是不正确的。

完整代码可在此处获得: https ://github.com/patrickmestabrook/song-swap

4

1 回答 1

2

我猜这与序列化/反序列化过程有关。您是否尝试过在 serializeUser 方法中使用 _id.toString() ?

您是否确认在 models.js中返回了正确的用户?

schemas.User.static('authenticate', function( username, password, done) {
  console.log('schemas.User.static.authenticate');
  console.log('-username is ' + username);
  console.log('-password is ' + password);


  this.findOne({ username: username }, function( err, user ) {
    console.log('this.findOne inside authenticate, callback');
    console.log('user.username is ' + user.username);

    if ( err   ) return done( err );
    if ( !user ) return done( null, false );
    user.verifyPassword( password, function( err, passwordCorrect) {


      if ( err ) return done( err );
      if ( !passwordCorrect ) { return done( null, false ); }
      // return done( null, user );
      done ( null, user );
    })
  })
})

还要检查是否将正确的用户名和密码传递给 authenticate 方法

passport.use(new LocalStrategy(function( username, password, done ) {  
  console.log('username: ' + username)
  console.log('password: ' + password)
  models.User.authenticate( username, password, function( err, user) {
    // right now, this reports the WRONG USER DAMMIT
    console.log('models.User.authenticate callback');
    console.log('--username is ' + user.username);
    // return done( err, user );
    done( err, user);
  });

}));
于 2013-04-05T21:01:33.093 回答