护照本地策略没有被调用

我确定我在这里错过了一些非常明显的东西,但我无法弄清楚这一点。 当传递login表单时,我传递给LocalStrategy构造函数的函数不会被调用。

码:

var express = require('express'); var http = require('http'); var path = require('path'); var swig = require('swig'); var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; passport.serializeUser(function(user, done) { console.log('Serialize user called.'); done(null, user.name); }); passport.deserializeUser(function(id, done) { console.log('Deserialize user called.'); return done(null, {name: 'Oliver'}); }); passport.use(new LocalStrategy( function(username, password, done) { console.log('local strategy called with: %s', username); return done(null, {name: username}); })); var app = express(); app.set('port', process.env.PORT || 3000); app.set('view engine', 'swig'); app.set('views', __dirname + '/views'); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieParser('asljASDR2084^^!')); app.use(express.session()); app.use(passport.initialize()); app.use(passport.session()); app.use(app.router); app.use(require('less-middleware')({ src: __dirname + '/public' })); app.use(express.static(path.join(__dirname, 'public'))); app.use(express.errorHandler({ dumpExceptions:true, showStack:true })); app.engine('swig', swig.renderFile); app.post('/auth', passport.authenticate('local')); app.get('/login', function(req, res) { // login is a simple form that posts username and password /auth res.render('login', {}); }); http.createServer(app).listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); }); 

我/login页面上的表格是从护照文档中剪切和粘贴的,除了我将其更改为/ auth而不是/ login:

 <form action="/auth" 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="Log In"/> </div> </form> 

当我提交login表单时,会logging下列内容

 GET /login 200 5ms - 432b POST /auth 401 6ms 

请注意,“本地策略调用”从不logging。

为什么我传递给LocalStrategy的函数没有被调用?

我最近遇到这个问题,可能是由一些事情造成的。 首先要检查的是确保bodyParser被设置为快速,我看到你已经完成了。

 app.use(express.bodyParser()); 

接下来要确保提交给路由的表单既包含username包含password用户还必须在两个字段中input内容 。 我被困住了一下testing它,而不是实际上把任何东西放在密码字段,而testing:) Passport需要两个执行LocalStrategyvalidationfunction传递给passport.authenticate('local')

您的示例似乎也设置为正确捕获用户名和密码,但无论如何,您应该尝试testing即使没有护照也正确parsing正文:

 app.post('/auth', function(req, res){ console.log("body parsing", req.body); //should be something like: {username: YOURUSERNAME, password: YOURPASSWORD} }); 

其他

你尝试添加一个请求处理程序到你的/auth路由吗?

 app.post('/auth', passport.authenticate('local'), function(req, res){ console.log("passport user", req.user); }); 

要么

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

当您使用不同的用户名,密码input字段比默认的字段时,你得到401。 你必须在你的LocalStrategy中提供这样的内容:

 passport.use(new LocalStrategy({ usernameField: 'login', passwordField: 'password' }, function(username, password, done) { ... } )); 

默认是usernamepassword我想。 看到这里的文档。

我想你提交的表单用户名或密码字段为空。

如果你填写两个input然后提交,LocalStrategy将被调用。

当我设置自己的路由处理程序(从中调用passport.authenticate())时遇到了同样的问题。 我忘记了passport.authenticate返回必须被调用的中间件,所以只调用passport.authenticate是不够的。 然后我换了

 router.post("/", function(req,res,next){ passport.authenticate("local", function(err, user, info){ // handle succes or failure }); }) 

 router.post("/", function(req,res,next){ passport.authenticate("local", function(err, user, info){ // handle succes or failure })(req,res,next); }) 

对于Express 4.x:

 // Body parser var bodyParser = require('body-parser'); app.use(bodyParser.urlencoded({ extended: false })) // parse application/x-www-form-urlencoded app.use(bodyParser.json()) // parse application/json 

参考https://github.com/expressjs/body-parser

几个小时之后,我也为了这个问题而ban my不安。 正如其他答案所告知的那样,所有的事情都是这样的。1. Form返回所有字段。 2.身体parsing器正确设置与扩展:真3.护照与每一个设置和configuration。

但是我已经更改了phoneNumber和密码的用户名字段。 通过更改下面的代码解决了我的问题

  passport.use('login', new LocalStrategy( {usernameField:'phoneNumber', passwordField:'password'}, function (username, password, done) { // your login goes here }) 

);

如果任何人想要我可以使用mongodb和护照本地编写整个身份validation程序的电话号码。

谢谢@ user568109

我的问题是,我有enctype ='multipart / form-data'。 只要将其改为multipart ='urlencoded'。 而且我认为这将解决它。

有可能你的请求没有正确的格式(特别是它的主体),你的用户名和密码没有被发送。

下面是一个API调用包装的例子,它强制你的请求体被parsing为json:

 Api = {}; Api.request = (route, options) => { options = options || {}; options.method = options.method || 'GET'; options.credentials = 'include'; if (options.method === 'POST') { options.headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', }; options.body = JSON.stringify(options.data) || '{}'; } fetch(absoluteUrl + '/api/' + route, options) .then((response) => response.json()) .then(options.cb || (() => {})) .catch(function(error) { console.log(error); }); }; 

它可以这样使用:

 Api.request('login', { data: { username: this.state.username, password: this.state.password }, method: 'POST', cb: proxy((user) => { console.log(user); }, this) }); 

对我来说,一切安装正确..问题是,我正在收集表单数据,然后从表单数据创build一个JSON并将其发送像JSON.stringify(formdatajson)到服务器。 (对我来说login表单是在屏幕上popup)

我通过debuggingpassportjs发现我的错误…

如果你也有同样的问题,并没有上述解决scheme似乎为你工作,然后debuggingpassportjs。

打开

 strategy.js 

把debugging器放在下面的方法中。

 Strategy.prototype.authenticate 

检查什么样的表格数据是为你准备的。 希望这个帮助…

  1. npm安装passport-local

  2. var passport = require('passport'),LocalStrategy = require('passport-local')。

根据passportjs.org ,它为我工作!