2012-06-21 92 views
0

我有一個讓我檢查用戶身份驗證的中間件,這裏是:檢查用戶身份驗證

function checkAuth(req, res, next) { 
if (!req.session.user_id) { 
    res.redirect('/login'); 
} else { 
    next(); 
} 
} 

我對此有兩個問題;

  1. 它強大的用戶驗證檢查?或者我應該在DB檢查user.id像如下:

    if (!req.session.user_id) { 
        res.redirect('/login'); 
    } else { 
        User.findById(req.session.user_id, function (err, user) { 
        if (!user) return res.redirect('/login'); 
        else return next(); 
    }) 
    } 
    
  2. 如果檢查失敗我重定向到登錄頁面:

    res.redirect('/login'); 
    

    ,但如果我得到一個AJAX請求我應發送以下內容(我認爲)

    res.send(403, 'Permission denied'); 
    

    那麼如何檢查一種請求併發送適當類型的響應? 這樣做是否正確?

回答

4

檢查會話就足夠了。服務器的會話和客戶端之間有一個映射,這就是爲什麼它足夠安全。當然,如果你想要「絕對」的安全性(但不存在100%的安全性),你就使用SSL。

下面是如何的Django /回報率檢查,如果請求來自一個AJAX調用(在node.js的代碼轉換的):

function isXHR(req, res) { 
    return !!req.header('HTTP_X_REQUESTED_WITH') === 'XMLHttpRequest'; 
} 

然而,這意味着,XHR呼叫必須包括這個HTTP標頭。大多數庫都是這樣做的(jQuery,Dojo,YUI,...),但是如果您正在執行手動XHR請求,則不能忘記包含它。

這可能會滿足您的需求的另一種方法:

function isJSON(req, res) { 
    return !!req.header('Content-Type') === 'application/json'; 
} 

在那裏,你檢查的Content-Type頭。如果它詢問一些JSON數據(如大部分XHR請求),則向其發送一些JSON數據。

+0

我聽說HTTP_X_REQUESTED_WITH可以被代理刪除,是嗎? – Erik

+0

是的。代理可以對HTTP請求執行任何操作。但除此之外,沒有可靠的方法,因爲任何東西都可以僞造/改變。另一種方法是檢查「Content-Type」頭,如果它詢問「application/json」,則發送它的JSON數據。 –

+0

謝謝。第一個問題是什麼? – Erik