2

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

我正在尝试使用 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);

我总是收到 Failed to authenticate 消息。就像我说的那样,我已经用 mongoose 剥离了与模式/模型相关的所有代码,以从示例 MongoDB 中读取数据。passport.authenticate 回调只返回带有 2 个字段的对象的 done 函数,称为 username 和 password ,就像 passport-local 所期望的一样

你能帮助我吗?

4

1 回答 1

3

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

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

或者,使用数据库:

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 或类似方法比较它们的哈希值。

于 2014-07-11T20:40:03.487 回答