2011-11-03 41 views
67

我有這個節點服務器上運行登錄身份驗證:如何實現的node.js

var server=http.createServer(function(request, responsehttp) { 
    if (request.method == 'POST') { 
     var body = ''; 
     request.on('data', function (data) { 
      body += data; 
     }); 
     request.on('end', function() { 
      var POST = qs.parse(body); 
      processquery(POST, request, responsehttp); 
     }); 
    } else { 
     var url_parts = url.parse(request.url, true); 
     var query = url_parts.query; 
     console.log(query); 
     processquery(query, request, responsehttp); 
    } 
}); 

我要添加登錄表單該服務器。所以,當用戶被驗證,那麼它會顯示。

function processquery(query, request, responsehttp){ 
    var returnResult = function (data){ 
     responsehttp.end(JSON.stringify(data)); 
    }; 

    if (!query.command) { 
     fileprocess(request, responsehttp); 
    } 
    responsehttp.writeHead(200, {"Content-Type": "application/json"}); 
    switch(query.command) { 
     case 'logout': 
      logout(query, returnResult); 
      break; 
     case 'login': 
      login(query, returnResult); 
      break; 
    }  
} 
過程查詢功能的文件返回到客戶端

如果沒有給出任何命令, 這樣我就可以從客戶端向服務器發送登錄命令,但是當它收到使用用戶名密碼登錄命令應該做的服務器,它應該如何處理登錄請求並返回登錄成功或失敗,因爲寫這部分我需要幫助。

我試過了。

function login(request, callback) { 
    if(request.username==users[request.username] && request.password==users[request.username].password) { 
     users[request.username].auth=true; 
     var data = {result:'success','message':'login successful'}; 
     callback(data); 
    } else { 
     var data = {result:'error','message':'login incorrect'}; 
     callback(data); 
    } 
} 

請建議我如何能在這方面,我嘗試添加添加會議,要求在登錄功能變量和嘗試設置的request.session變量,它說的request.session是不確定的。

請建議我如何編寫這個登錄模塊,它可以爲每個用戶正確維護登錄身份驗證。

+0

與連接完成:http://blog.nodejitsu.com/sessions-and-cookies-in-node – XMen

回答

224

這裏是我如何做到這一點與Express.js

1)檢查,如果用戶進行身份驗證:我有一個名爲CheckAuth中間件功能,我每天都需要用戶進行身份驗證航線上使用:

function checkAuth(req, res, next) { 
    if (!req.session.user_id) { 
    res.send('You are not authorized to view this page'); 
    } else { 
    next(); 
    } 
} 

我用這個功能在我的路線是這樣的:

app.get('/my_secret_page', checkAuth, function (req, res) { 
    res.send('if you are viewing this page it means you are logged in'); 
}); 

2)登錄路徑:

app.post('/login', function (req, res) { 
    var post = req.body; 
    if (post.user === 'john' && post.password === 'johnspassword') { 
    req.session.user_id = johns_user_id_here; 
    res.redirect('/my_secret_page'); 
    } else { 
    res.send('Bad user/pass'); 
    } 
}); 

3)註銷路線:

app.get('/logout', function (req, res) { 
    delete req.session.user_id; 
    res.redirect('/login'); 
});  

如果您想了解更多關於Express.js點擊此處查看他們的網站:expressjs.com/en/guide/routing.html 如果需要更多的真實複雜的東西,結帳everyauth(它有很多auth方法可用,用於facebook,twitter等;好教程here)。

+1

的Express.js文件說,你必須使用會話管理的連接中間件。你的代碼是否仍然相關? – nimrodm

+0

是的,我已經使用連接中間件編寫了上面的代碼,以便記錄會話(請參閱上面的'req.session')。代碼仍然相關。 – alessioalex

+0

我認爲你的'delete res.session.user_id;'應該是'delete req.session.user_id;'。 –

5

其實這不是問題的答案,但這是一個更好的方法。

我建議您使用connect/express作爲http服務器,因爲它們爲您節省了大量時間。你顯然不想重新發明輪子。在你的情況下,使用connect/express會話管理更容易。我想建議你使用everyauth。它支持許多認證策略。令人敬畏的快速發展。

所有這些都可以輕鬆地從他們的文檔粘貼一些副本!

2

爲了增加法裏德的僞答案,

考慮使用Passport.js超過everyauth

this question的回答提供了一些洞察差異。


將用戶身份驗證卸載到Google,Facebook或其他網站有很多好處。如果您的應用程序需求使您可以使用Passport作爲您唯一的身份驗證提供程序或與傳統登錄一起使用,它可以使您的用戶更容易使用體驗。

1

@alessioalex答案是新鮮節點用戶的完美演示。但無論如何,很難將checkAuth中間件寫入除登錄之外的所有路由,因此最好將每個路由的checkAuth移動到具有app.use的一個條目中。例如:

function checkAuth(req, res, next) { 
    // if logined or it's login request, then go next route 
    if (isLogin || (req.path === '/login' && req.method === 'POST')) { 
    next() 
    } else { 
    res.send('Not logged in yet.') 
    } 
} 

app.use('/', checkAuth)