2016-11-10 52 views
0

用下面的代码我不能用MongoDB数据库,已经有与之相关联的用户模式和用户进行身份验证,我想知道我怎么会确保权威性返回isAuth ?:如何使用Node.js + Mongoose进行身份验证?

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; 
    }); 
}; 
+2

为了安全起见,我建议你试试[护照](https://github.com/jaredhanson/passport),而不是实施自己的验证模块。 – chridam

+2

^听@chridam。验证是错误的可怕的事情。 –

回答

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;运行之前返回。

而且,如果宇检查错误与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一样工作的其他解决方案。我写了答案来解释使用回调的过程,而不是认可以特定方式使用验证的想法。你被警告了。

+0

我按照建议将'&'更改为'&&',但现在我得到[false,true],而不是[0,1],所以它没有区别。我需要的是外部函数返回isAuth。 –

+0

@AidenPearce查看我更新的答案。 – rsp

+1

我还会指出,使用腌制的单向散列来存储和比较明文密码是一种可怕的,可怕的想法。 – Paul