2015-05-31 112 views
1

我使用express和passport来建立一个休息api后端,似乎我的localStrategy没有被请求调用。passportjs本地策略没有被调用

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

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: '[email protected]', password: 'secret' } 
POST /auth - - ms - - 

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

回答

3

首先,您在routes.js中有一些基本的javascript语法错误。这部分就在这里(很多为清楚起见移除代码)被打破:

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

它可能是刚才添加在错误的地方一些console.log电话。为了消除混淆,passport.authenticate()不立即执行身份验证,它所做的是为您返回一个中间件。你可以使用像这样的例子:

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

因此,要解决您的问题,尝试调用由身份验证马上返回的中间件,像这样:

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

而且,我必须告诉你, require缓存模块。再次里面config/passport.js

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'); 
+0

谢谢,这帮助我解决了这个问题。 – Depa

3

[编辑]我发现问题。由于Express不再支持身体解析器等子包,因此需要单独设置它们。一切都会好了我这样做了摆在首位,但我只激活:

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 

下一步登录控制器

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

下一步护照身份验证处理程序

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个其他类似问题的线程,没有任何工作。

如果有人能给我金色的提示,我会永远gratefull。

+0

app.use(bodyParser.json());工作。你让我免于疯狂。 – Aparna