【问题标题】:passport.js successful authentication not calling next()passport.js 成功认证不调用 next()
【发布时间】:2013-10-08 11:26:20
【问题描述】:

我正在使用 passport.js 进行身份验证。似乎在成功验证后,护照不会调用next(),所以我的 Express 路由永远不会执行。对于我实施的两种身份验证策略,我都看到了这种行为。

app.js

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

routes.setup(app, passport);

routes.js

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

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.' });
      }
    });
  }
);

更新

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

// ----------------------------------------------------------------------------
// 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);

【问题讨论】:

  • routes.authentication.token 定义在哪里? routes.js 中没有路由。
  • @user568109 它在文件的其他地方定义。如果我将 routes.authentication.token 替换为调用 console.log() 的函数,则永远无法到达该函数。

标签: javascript node.js authentication passport.js


【解决方案1】:

问题似乎与 Express 中间件的顺序有关。 app.use(passport.initialize()); 和护照设置需要之前 app.use(app.router);

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,我不小心从我的 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);
        });
    });
    

    【讨论】:

    • 我没有使用会话,因为这是用于 API,所以我也没有使用 serializeUser 或 deserializeUser。我试过打开会话并添加用户序列化,但没有帮助。
    • 如果您不使用会话,您应该在您的身份验证调用中禁用它们:passport.authenticate('local', { session: false });
    猜你喜欢
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 2020-06-07
    • 2015-01-01
    • 1970-01-01
    • 2015-09-03
    相关资源
    最近更新 更多