Passport-local返回400错误,从不查询数据库

我试图在我的node.js应用程序中使用passport.js来validation用户与MongoDB。 我从来没有成功。

在post中,我发送“email”:“email@gmail.com”,“密码”:“testing”

var passport = require('passport') , LocalStrategy = require('passport-local').Strategy; app.post('/login', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/fail' }) ); passport.use(new LocalStrategy({ emailField: 'email', passwordField: 'passw', }, function (emailField, passwordField, done) { process.nextTick(function () { db.collection(users, function (error, collection) { if (!error) { collection.findOne({ 'email': emailField, 'password': passwordField }, function (err, user) { if (err) { return done(err); } if (!user) { console.log('this email does not exist'); return done(null, false); } return done(null, user); }); } else { console.log(5, 'DB error'); } }); }); })); 

在MongoDB的用户集合中:

 { "_id": { "$oid": "533b5283e4b09d8a1148b4c4" }, "email": "email@gmail.com", "password": "test" } 

也许我没有连接到数据库的权利,我不知道。

另外,当我login所有的function,我没有得到任何日志。 我只是得到

  POST /login 302 7ms - 39b GET /fail 404 3ms 

任何build议将不胜感激。 我想我可能会错过一些东西,但我不确定如何构造这个。 在我正在写数据库的其他函数中,我必须使用:

 var uristring = process.env.MONGOLAB_URI || process.env.MONGOHQ_URL || 'mongodb://<myurlhere>'; mongo.connect(uristring, function (err, db) { 

这里是更新的代码

要求这些:

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

使用这些:

 // all environments app.set('port', process.env.PORT || 3000); app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.json()); app.use(express.urlencoded()); app.use(express.methodOverride()); app.use(express.cookieParser()); app.use(express.session({ secret: 'keyboard cat'})); app.use(logfmt.requestLogger()); app.use(express.static(path.join(__dirname, 'public'))); app.use(passport.initialize()); app.use(passport.session()); app.use(app.router); // User authentication passport passport.use(new LocalStrategy( { usernameField: 'email', passwordField: 'passw', }, function (userId, password, done) { // removed process.nextTick console.log('Hey! no more 400 error!'); db.collection(users, function (error, collection) { if (!error) { collection.findOne({ 'email': userId, 'password': password }, function (err, user) { if (err) { return done(err); } if (!user) { console.log('this email does not exist'); return done(null, false); } return done(null, user); }); } else { console.log(5, 'DB error'); } }); } )); passport.serializeUser(function(user, done) { done(null, user); }); passport.deserializeUser(function(user, done) { done(null, user); }); app.post('/login', passport.authenticate('local'), function(req, res) { console.log('SUCCESS WOOOO'); // If this function gets called, authentication was successful. // `req.user` contains the authenticated user. //res.redirect('/users/' + req.user.username); }); 

这个代码总是给我POST /login 400 10ms时发布到/login。 我所有的其他路线工作正常。

1)可怕的HTTP 400错误

未设置用户名和/或密码时,Passport将引发HTTP 400错误。

请参阅Strategy.prototype.authenticate引发“缺less凭据”错误的第75行的来源。

2)诊断原因

在你的代码中,你有这个块:

 passport.use(new LocalStrategy({ emailField: 'email', passwordField: 'passw', }, 

但是emailField不能被护照识别。 回到源代码中 ,我们看到护照正在寻找:

 this._usernameField = options.usernameField || 'username'; this._passwordField = options.passwordField || 'password'; 

这就是HTTP 400在这种特定情况下被抛出的原因。

4)解决问题

我已经编辑你的原代码,我相信会比原来的(更好)。 编辑时,我采取了一些自由,以删除process.nextTick命名了一些东西。 我希望你是一个宽容的人。 🙂

 passport.use(new LocalStrategy( { usernameField: 'email', passwordField: 'passw', }, function (userId, password, done) { // removed process.nextTick console.log('Hey! no more 400 error!'); db.collection(users, function (error, collection) { if (!error) { collection.findOne({ 'email': userId, 'password': password }, function (err, user) { if (err) { return done(err); } if (!user) { console.log('this email does not exist'); return done(null, false); } return done(null, user); }); } else { console.log(5, 'DB error'); } }); } )); 

5)一些结束语:

  • 您还可以编辑表单input属性以匹配护照的预期默认值。 请参阅护照文件的指导。
  • 我不能保证MongoDB调用会起作用,但是这应该会让你超越HTTP 400.如果数据库调用有问题,那几乎肯定是一个新的问题,因为涉及到一组不同的代码和模块。
  • 使用护照时,值得参观GitHub项目页面并阅读源代码。 在源代码中经常有评论(a)不在其他文档中,或者(b)与他们所描述的代码接近……所以即使你不是编码大师或者其他任何东西,也可以为你澄清。

这最终成为邮差的一个问题(我已经使用了很多次没有问题)。

一旦我使用了一个真正的HTML表单,它工作得很好。 也许是标题的事情?