passport.js成功验证没有调用next()

Ian*_*ers 5 javascript authentication node.js passport.js

我使用passport.js进行身份验证.看来,在成功验证后,护照不会打电话next(),所以我的Express路线永远不会被执行.对于我实现的两种身份验证策略,我都看到了这种行为.

app.js

app.use(passport.initialize());
passport.use(authentication.local);
passport.use(authentication.bearer);

routes.setup(app, passport);
Run Code Online (Sandbox Code Playgroud)

routes.js

function setup (app, passport) {
  // routes.authentication.token not called, despite successful authentication.
  app.post('/authentication/token', passport.authenticate('local'), 
      routes.authentication.token);
}
Run Code Online (Sandbox Code Playgroud)

authentication.js

var local = new LocalStrategy(
  {
    usernameField: 'email',
    passwordField: 'password'
  },

  function (email, password, done) {
    var user = new User({ email: email });

    user.fetch({
      success: function (user) {
        if (bcrypt.compareSync(password, user.get('encryptedPassword'))) {
          // This line shows in the console, but the route after is never executed.
          console.log("LocalStrategy success!");
          done(null, user); // Tell passport we have success.
        } else {
          done(null, false, { message: 'The password given was incorrect.' });
        }
      },

      error: function (err) {
        done(null, false, { message: 'The email address (' + email + ') does not belong to any user.' });
      }
    });
  }
);
Run Code Online (Sandbox Code Playgroud)

UPDATE

这是一个问题的单文件复制,可能比上面不完整的多文件问题更容易理解:

// ----------------------------------------------------------------------------
// Environment/Configuration
// ----------------------------------------------------------------------------
var config =  require('./lib/config');

var environment = process.env.NODE_ENV || 'development';
config.load(__dirname + '/config/environment', environment);
config.loadDev(__dirname + '/config/environment', environment);

// ----------------------------------------------------------------------------
// Requirements
// ----------------------------------------------------------------------------
var express = require('express')
  , passport = require('passport')
  , bcrypt = require('bcrypt')
  , LocalStrategy = require('passport-local').Strategy
  , User = require('./app/models/user');


// ----------------------------------------------------------------------------
// HTTP Server
// ----------------------------------------------------------------------------
var app = express();

// ----------------------------------------------------------------------------
// Middleware
// ----------------------------------------------------------------------------
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);

app.use(passport.initialize());

passport.use(new LocalStrategy(
  {
    usernameField: 'email',
    passwordField: 'password'
  },

  function (email, password, done) {
    console.log("Authenticating user.", email, password);
    var user = new User({ email: email });

    user.fetch({
      success: function (user) {
        if (bcrypt.compareSync(password, user.get('encryptedPassword'))) {
          // This log statement shows in the console.
          console.log("LocalStrategy success!");
          done(null, user);
        } else {
          done(null, false, { message: 'The password given was incorrect.' });
        }
      },

      error: function (err) {
        console.log('LocalStrategy failure!');
        done(null, false, { message: 'The email address (' + email + ') does not belong to any user.' });
      },

      complete: function (user, res) {
        console.log(res);
      }
    });
  }
));

app.post('/authentication/token', passport.authenticate('local'), function (req, res, next) {
  // This line is never reached.
  console.log('I\'m authenticated!');
});

// ----------------------------------------------------------------------------
// Boot
// ----------------------------------------------------------------------------
app.listen(process.env.PORT);
console.log('Server started on port: %d', process.env.PORT);
Run Code Online (Sandbox Code Playgroud)

Rik*_*igh 0

我遇到了同样的问题,并且我不小心从我的 serializeUser 函数中删除了回调。

也许检查您的序列化和反序列化函数是否正确。

下面的代码是我使用的,你的代码可能会有所不同,具体取决于你是否使用用户的 id 进行序列化,或者使用不同的字段。

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

passport.deserializeUser(function(id, done) {
    User.findById(id, function(err, user) {
        done(err, user);
    });
});
Run Code Online (Sandbox Code Playgroud)