我如何使用Node.js + Mongoose进行身份验证?

时间:2016-11-10 14:14:07

标签: node.js mongodb

使用以下代码,我无法使用MongoDB数据库进行身份验证,该数据库已经有一个用户架构和与之关联的用户,我想知道如何确保auth返回isAuth?:

exports.auth = function(username, password, session) {
    User.findOne({username: username}, function(err, data) {
        if (err) {
            console.log(err);
        }

        var isAuth = username === data['username'] & password === data['password'];

         if (isAuth) {
             session.isAuthenticated = isAuth;
             session.user = {username: username};
         }

         return isAuth;
    });
};

1 个答案:

答案 0 :(得分:2)

首先,正如其他人已经在评论中指出的那样,如果你不知道自己在做什么,就不应该实现自己的身份验证逻辑。您可以使用Passport

现在,您提供的代码。这里有几个问题。

首先想到的是你使用:

var isAuth = username === data['username'] & password === data['password'];

而不是:

var isAuth = username === data['username'] && password === data['password'];

但这只是一个错字。现在,更基本的东西。

您无法返回isAuth变量,因为您要将其返回给谁?如果您认为它会返回exports.auth的来电者那么您错了 - exports.auth()会在return isAuth;运行之前很久就返回。

另外,如果yu用if (err)检查错误,那么在else块中将成功运行的代码放在o中,否则它也会在出现错误时运行,其中包含未定义的变量可能会破坏你的程序。

您需要在函数中添加一个附加参数,这是一个回调:

exports.auth = function(username, password, session, callback) {
    User.findOne({username: username}, function(err, data) {
        if (err) {
            console.log(err);
            callback(err);
        } else {
            var isAuth = username === data.username && password === data.password;
            if (isAuth) {
                session.isAuthenticated = isAuth;
                session.user = {username: username};
            }
            callback(null, isAuth);
        }
    });
};

或从exports.auth函数返回一个承诺(但直接来自您的exports.auth函数,而不是其他内部的回调函数。)

使用上述版本,您可以使用以下方式调用它:

auth(username, password, session, function (isAuth) {
  // you have your isAuth here
});

另一种选择是使用承诺。您可以看到其他一些答案,其中我解释了回调和承诺之间的区别以及如何更详细地使用它们,这可能对您有所帮助:

但首先你需要对回调感到满意。

此外,从不将密码以明文形式存储在数据库中。说真的,使用一些像Passport一样的解决方案。我写了答案来解释使用回调的过程,而不是赞同以特定方式使用身份验证的想法。你被警告了。