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

相關問題