当执行异步登录到本地护照时,我的会话永远不会存储用户,并且永远不会调用序列化。
因为我在登录时没有重定向(我只是通过对他们的ajax调用的响应通知用户)我想我必须在登录时手动触发序列化?我不确定当用户刷新时会话如何将用户关联起来。这是我主要担心的问题,因为我的用户从未将主页留在我的用例中,但是我希望他们在刷新后保持登录一段时间(除非他们明确注销)。
我在使用ajax登录时如何才能导致护照保存会话?
配置
app.use(require('express-session')({secret:'secret'}));
app.use(passport.initialize());
app.use(passport.session());
app.get('/', function(req, res) {
res.render('index', {
user: req.user // undefined here, although req.session does exist. req.session.passport does not exist.
});
});
app.post('/login', function(req, res, next) {
passport.authenticate('local-login', {}, function(error, user, info) {
if (error) {
return res.status(500).json(error);
}
if (!user) {
return res.status(401).json(info);
}
res.json({user: user});
})(req, res, next);
});
登录电话,客户端
$.ajax({
url: "/login",
type: "POST",
contentType: "application/json",
data: '{"email":"a@b.c", "password":"abc"}',
cache: false,
timeout: 5000,
success: function(data) {
data.user; // valid, this comes back.
}
});
序列化(从未调用)
passport.serializeUser(function(user, done) {
console.log('serialize user:', user); // never called
done(null, user);
});
passport.deserializeUser(function(id, done) {
console.log('deserializeUser user:', user); // never called
User.findById(id, function(err, user) {
console.log('deserializeUser user (done):', user);
done(err, user);
});
});
策略
var onLocalLoginStrategy = function(req, email, password, done) {
User.findOne({
'local.email': email.toUpperCase()
}, function(err, user) {
if (err)
return done(err);
if (!user)
return done(null, false, { message:'No user found.'} );
if (!user.validPassword(password))
return done(null, false, { message: 'Incorrect password.' });
return done(null, user);
});
};