2015-05-31 65 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