2012-06-21 52 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