Passport身份验证无效。 Passport.serializeUser和passport.deserializeUser从未调用被调用

时间:2016-09-23 06:52:20

标签: node.js express passport.js middleware passport-local

登录我的应用程序后,护照(本地策略)中间件将密码与存储在数据库中的密码匹配,并将我路由到用户页面,但它不会启动会话,因此我无法对帖子进行身份验证并获得该用户的请求。

在玩完代码之后我发现,从不调用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 Post身份验证请求

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

                    }); 

1 个答案:

答案 0 :(得分: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); 
     });