0

我有允许我检查用户身份验证的中间件,这里是:

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

我有两个问题;

  1. 它是强大的用户身份验证检查吗?或者我应该像下面这样检查数据库中的 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

1 回答 1

4

检查会话就足够了。服务器会话和客户端会话之间存在映射,这就是它足够安全的原因。当然,如果您想要“绝对”安全性(但不存在 100% 安全性),那么您正在使用 SSL。

以下是 Django/RoR 如何检查请求是否来自 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 数据。

于 2012-06-21T12:37:54.107 回答