Nodejs Passport验证回调没有被调用而没有错误

时间:2014-07-10 23:56:27

标签: node.js express passport.js passport-local

我见过与我类似的问题,但我找不到合适的答案。

我正在尝试使用nodejs + express + passport(本地策略)实现一个非常简单的登录表单。问题是,似乎我的身份验证回调总是失败。我删除了与测试数据库的每个连接(每个教程都有一个示例MongoDB)。

这是我的登录表单

<html>
  <body>
    <form action="/login" method="post">
      <div>
        <label>Username:</label>
        <input type="text" name="username" />
        <br/>
      </div>
      <div>
        <label>Password:</label>
        <input type="password" name="password" />
      </div>
      <div>
        <input type="submit" value="Submit" />
      </div>
    </form>
  </body>
</html>

这是我的server.js(我用npm start运行它)

var express = require('express');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;

var app     = express();
var port    =   process.env.PORT || 8080;

app.use(passport.initialize());
app.use(passport.session());

passport.use(new LocalStrategy(function(username, password, done) {
        // no authentication logic here... just return done with an object with 2 fields
        return (done, {username : username, password : password});
}));

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

passport.deserializeUser(function(obj, done) {
  done(null, obj);
});

// ROUTES
// ==============================================

// sample route with a route the way we're used to seeing it

app.post('/login',
                passport.authenticate('local', {
                successRedirect: '/loginSuccess',
                failureRedirect: '/loginFailure'
                })
);

app.get('/login', function(req, res) {
  res.sendfile('views/login.html');
});

app.get('/loginFailure', function(req, res, next) {
  res.send('Failed to authenticate');
});

app.get('/loginSuccess', function(req, res, next) {
  res.send('Successfully authenticated');
});

// START THE SERVER
// ==============================================
app.listen(port);

console.log('Magic happens on port ' + port);

我总是收到失败的身份验证消息。就像我说的那样,我已经删除了与mongoose相关的模式/模型的每个代码,以从MongoDB示例中读取数据。 passport.authenticate回调只返回带有2个字段的对象的done函数,称为用户名和密码,就像护照本地所期望的那样

你能帮助我吗?

1 个答案:

答案 0 :(得分:3)

我不相信你正确地调用了回调: 第一个参数需要一个错误或null,第二个参数需要false或用户对象。

passport.use(new LocalStrategy(function(username, password, done) {
    // no authentication logic here... just return done with an object with 2 fields
    done(null, {username : username, password : password}); 
}));

或使用db:

passport.use(new LocalStrategy(function(username, password, done) {
    db.users.findOne({ username : username}, function(err, user){
       if(err) return done(err);
       if(!user || user.password !== password) return done(null, false); 
       done(null, user);
    });
});

在这里,您可以看到我们在响应用户对象之前比较密码,然后由护照库附加到req.user。当然你不会比较两个密码,而是使用bcrypt或类似的哈希。