首页 文章

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

提问于
浏览
2

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

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

这是我的登录表单

<html>
  <body>
    <form action="/login" method="post">
      <div>
        <label>Username:</label>
        <input type="text" name="username" />
        
</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 回答

  • 3

    我不相信你正确地调用了回调:第一个param期望一个错误或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或类似的哈希 .

相关问题