passportjs本地策略没有被调用

我正在使用快递和护照来build立一个restAPI后端,似乎我的localStrategy没有被请求调用。

我的应用程序的入口点如下所示:

app.js

var fs = require('fs'); var express = require('express'); var mongoose = require('mongoose'); var passport = require('passport'); var config = require('./config/config'); var morgan = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var app = express(); app.use(morgan('dev')); // log every request to the console app.use(cookieParser()); // read cookies (needed for auth) app.use(bodyParser.urlencoded({extended:true})); app.use(passport.initialize()); //connect to mongodb mongoose.connect(config.db, options); //load models (shorten forEach) ... require(__dirname + '/models/' + file)(mongoose); //load passport config require('./config/passport')(mongoose, passport); //load routes require('./config/routes')(app, passport); //start server var server = app.listen(3000, .... 

routes.js

 ... app.post('/auth', function(req, res){ console.log("reached auth endpoint"); console.log(req.body); passport.authenticate('local', { session: false}, function(err, user, info){ console.log("Test:"+user); if(err) { console.log("Error1"); return next(err)} if(!user){ console.log("Error2"); return res.json(401, {error: 'Auth Error!'}); } console.log("Error3"); var token = jwt.encode({ username: user.email }, "hanswurst"); res.json({token: token}); }), function(req, res){ console.log("passport user", req.user); }; }); 

passport.js

 ... passport.use(new LocalStrategy({ usernameField: 'email', passwordField: 'password', passReqToCallback: true }, function(email, password, done){ console.log("TEST"); User.findOne({'email': email}, function(err, user){ if(err){ console.log("Unknown error"); return done(err); } if(!user){ console.log("No User found"); return done(null, false); } if(!user.validPassword(password)){ console.log("Password was incorrect"); return done(null, false); } console.log("User was found"); return done(null, user); }); } )); 

我得到的唯一结果是表单请求

 reached auth endpoint { email: 'test@mail.com', password: 'secret' } POST /auth - - ms - - 

对于我来说,请求主体看起来很好,它应该进入我的LocalStrategy。 我有点无奈,因为我从这一点上没有得到任何其他的控制台输出。

首先,你在routes.js中有一些基本的javascript语法错误。 这部分在这里(为清晰起见删除了大量的代码)被破坏了:

 passport.authenticate(/*...*/), function(req, res) {/*..*/}; 

这可能是因为你刚刚在错误的地方添加了一些console.log调用。 为了消除混淆, passport.authenticate()不会立即执行身份validation,它会为您返回一个中间件。 你会像这样使用它,例如:

 var middleware = passport.authenticate(...); app.post('/auth', middleware); 

因此,要解决您的问题,请尝试调用通过身份validation返回的中间件,如下所示:

 app.post('/auth', function(req, res, next) { console.log("reached auth endpoint"); console.log(req.body); passport.authenticate('local', { session: false }, function(err, user, info) { console.log("Test:" + user); if (err) { console.log("Error1"); return next(err); } if (!user) { console.log("Error2"); return res.json(401, { error: 'Auth Error!' }); } console.log("Error3"); var token = jwt.encode({ username: user.email }, "hanswurst"); res.json({ token: token }); })(req, res, next); }); 

另外,我必须告诉你requirecaching模块。 为了让config/passport.js知道mongoose和护照,你不应该把它们当作参数来喂食:

 require('./config/passport')(mongoose, passport); 

只需要在config/passport.js再次要求它们就像这样:

 // (in config/passport.js) // Both of these vars point to the same thing you require'd in app.js var mongoose = require('mongoose'); var passport = require('passport'); 

[编辑]我find了问题。 由于Express不再支持body-parser等子包,因此需要单独设置。 如果我首先完成了这一切,那么我只能激活:

 app.use(bodyParser.urlencoded({extended:true})); 

你也需要设置

 app.use(bodyParser.json()); 

为了让它正常工作。 愚蠢的疏忽,但仍然让我难倒了3天。


我有同样的问题,但似乎没有为我工作。

我将按照执行顺序从顶部删除代码

玉模板

 .navbar-right(ng-controller="mvNavBarLoginCtrl") form.navbar-form .form-group input.form-control(placeholder='Email', ng-model='username') .form-group input.form-control(type='password', placeholder='password', ng-model='password') button.btn.btn-primary(ng-click="signIn(username,password)") Sign In 

下一步login控制器

 angular.module('app').controller('mvNavBarLoginCtrl',function($scope, $http){ $scope.signIn = function (username, password){ console.log('un = ' + username); // Prints fine in the console console.log('pw = ' + password); // Prints fine in the console $http.post('/login', {username: username, password: password}).then(function(response){ if(response.data.success){ console.log('Logged in!!'); } else{ console.log('Failed to log in!!'); } }); } }); 

下一步路由处理程序

 app.post('/login', function(req, res, next){ console.log(req.username); // Already empty console.log(req.password); // Already empty console.log(req.body); // Already empty // Because of the use of AngularJS we can not call passport directly, // missing req and res will break the code var auth = passport.authenticate('local', function(err, user){ console.log(user); // prints undefined if(err){return next(err);} if(!user){res.send({success:false});} req.logIn(user, function(err){ if(err){return next(err);} res.send({success: true, user: user}); }); }); // call the auth function to start authenticate auth(req, res, next); }); 

下一步护照authentication处理程序

 var User = mongoose.model('User'); passport.use(new LocalStrategy({ username: 'username', password: 'password' }, function(username, password, done){ console.log("called"); // never printed // find user based in mongoose schema see 'var User' User.findOne({userName:username}).exec(function (err,user){ console.log(user) // never printed if(err){return done(err);} if(user){ return done(null, user); } else{ return done(null, false); } }); } )); passport.serializeUser(function(user, done){ if(user) { done(null, user._id); } }); passport.deserializeUser(function(id, done){ user.findOne({_id:id}).exec(function(err, user){ if(user) { done(null, user); } else{ done(null, false); } }); }); 

没有错误不在控制台中,也不作为节点输出。 我被困住了,读了大约5个类似的问题,没有任何工作的其他线程。

如果有人能给我一点黄金的话,我就会永远不知疲倦。