2016-09-23 24 views
0

當我登錄到我的應用程序後,護照(本地策略)中間件將密碼與存儲在數據庫中的密碼相匹配,並將我路由到用戶頁面,但它不會啓動會話,由於這個原因,我無法驗證帖子並獲得該用戶的請求。Passport身份驗證不起作用。 Passport.serializeUser和passport.deserializeUser從未調用過被調用

玩過代碼後,我發現passport.serializeUser和passport.deserializeUser都不會被調用,我使用console.log()來檢查它。

我從這link讀取護照控制流程,發現在密碼匹配並且用戶通過後,中間件調用了req.login,進一步調用passport.serializeUser,我認爲在我的情況下req.login是從來沒有因爲該會話不被維護,因此被稱爲。

我已經嘗試了一切,但無法弄清楚我哪裏出錯了。

這是我的密碼配置: -

var LocalStrategy = require('passport-local').Strategy; 
var User = require('../models/userModel'); 

module.exports = function(passport){ 

passport.serializeUser(function(user, done) { 
    console.log("serialize"); 
    done(null, user._id); 
}); 

passport.deserializeUser(function(id, done) { 
console.log("deserialize"); 
    User.getUserById(id, function(err, user) { 
    done(err, user); 
    }); 
}); 

passport.use(new LocalStrategy(function(username, password, done){ 
    User.getUserByUsername(username, function(err, user){ 
    if(err) throw err; 
    if(!user){ 
     console.log("not user"); 
     return done(null, false); 
    } 

    User.comparePassword(password, user.password, function(err, isMatch){ 
     if(err) return done(err); 
     if(isMatch){ 
     console.log("pass match"); 
     return done(null, user); 
     } else { 
     console.log("invalid pass "); 
     return done(null, false); 
     } 
    }); 
    }); 
})); 
} 

我總是得到響應「通過比賽,」如果我提交的登錄頁面正確的用戶信息。

這是登錄頁面,我已經安裝驗證請求

var LocalStrategy = require('passport-local').Strategy; 
var passportAuth = require('../config/passport'); 


module.exports = function(app,bodyParser,passport){ 

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


     app.post('/api/loginAuth', (req,res,next)=> { 
     passport.authenticate('local', function(err, user, info) { 
      if (err) { 
       console.log("inside error"); 
      return next(err); 
      } 
      if (!user) { 
       console.log("No user"); 
       res.status(401).send("not user"); 
      } else {   
       console.log("verified user"); 

       res.json(user); 
      } 
     })(req, res, next); 
    }); 
    passportAuth(passport);  
} 

護照和會話建立在我的app.js

var session = require('express-session'); 
var passport = require('passport'); 
// Handle Sessions 
app.use(session({ 
    secret:'secret', 
    saveUninitialized: true, 
    resave: true, 
})); 

// Passport 
app.use(passport.initialize()); 
app.use(passport.session()); 

這是我angularjs認證發佈採購信息

   $http({ 
        method: 'POST', 
        url: '/api/loginAuth', 
        data: $scope.userinfo, 
        withCredentials: true 
       }).success (
       function(response){ 
        var message = '<strong>'+response.name+'</strong>  Successfully logged in!! '; 
        sharedDataService.setMessage(message); 
        sharedDataService.setProperty(response.name); 
        $state.go('todo', {username: response.username}); 

        }); 
+0

你知道你在哪裏申報'POST/API/loginAuth'的路由被稱爲_after_添加護照中間件('passport.initialize()的代碼/ passport.session ()')? – robertklep

+0

是的,我確定,我已經重新檢查了它:) –

+0

如果會話cookie在成功登錄後設置,您可以檢查瀏覽器的開發工具。 – robertklep

回答

0

將此代碼添加到app.post的其他部分

req.logIn(user, function(err) { 
    if (err) { return res.send(err); } 
    res.json(user); 
    }); 

像這樣

app.post('/api/loginAuth', (req,res,next)=> { 
     passport.authenticate('local', function(err, user, info) { 
      if (err) { 
       console.log("inside error"); 
      return next(err); 
      } 
      if (!user) { 
       console.log("No user"); 
       res.status(401).send("not user"); 
      } else { 

       req.logIn(user, function(err) { 
       if (err) { return res.send(err); } 
       res.json(user); 
       }); 

      } 
     })(req, res, next); 
    });