2016-09-23 124 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); 
    });