哪种是实现“记住我”功能的最佳方法?

时间:2019-03-07 17:41:52

标签: node.js ajax express passport.js ejs

我正在使用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天,否则会话将在导航结束时终止。

这是个好方法吗?你有什么建议?

预先感谢您的帮助。

0 个答案:

没有答案