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});
});
你知道你在哪里申报'POST/API/loginAuth'的路由被称为_after_添加护照中间件('passport.initialize()的代码/ passport.session ()')? – robertklep
是的,我确定,我已经重新检查了它:) –
如果会话cookie在成功登录后设置,您可以检查浏览器的开发工具。 – robertklep