我正在使用PassportJS
,并且实际上实现了“记住我”功能,无论如何,我不知道我的解决方案是否可以很好地解决安全问题。
基本上在用户登录时,我会执行以下ajax请求:
$("#login").click(function (event) {
event.preventDefault();
let postData =
{
'email': $('#email').val(),
'password': $("#password").val(),
'remember': $('#remember').is(':checked')
};
$.ajax({
type: 'POST',
contentType: "application/json",
url: '/auth/login',
data: JSON.stringify(postData),
dataType: 'json',
success: function (data) {
window.location.replace('/dashboard');
},
error: function (jqXHR, textStatus, errorThrown) {
$('#messages').append(JSON.parse(jqXHR.responseText).errors);
}
});
});
然后在auth
控制器内部,我通过以下方式处理remember
选项:
exports.login = function (req, res, next) {
passport.authenticate('local', function (error, user, info) {
if (error) {
return res.status(500).send({ errors: error });
}
if (!user) {
return res.render('partial/messages', { error: 'Invalid credentials.', layout: false }, function (err, list) {
res.status(401).send({ errors: list });
});
}
if (req.body.remember) {
req.session.cookie.maxAge = 30 * 24 * 60 * 60 * 1000;
} else {
req.session.cookie.expires = false;
}
req.logIn(user, function (err) {
if (err) { return next(err); }
return res.status(200).send({ msg: true });
});
})(req, res, next);
}
我简单地将有效期设置为30天,否则会话将在导航结束时终止。
这是个好方法吗?你有什么建议?
预先感谢您的帮助。