登录我的应用程序后,护照(本地策略)中间件将密码与存储在数据库中的密码匹配,并将我路由到用户页面,但它不会启动会话,因此我无法对帖子进行身份验证并获得该用户的请求。
在玩完代码之后我发现,从不调用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});
});
答案 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);
});