【问题标题】:checking user auth检查用户身份
【发布时间】:2012-06-21 20:46:57
【问题描述】:

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

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');
    

    那么我如何检查请求类型并发送适当类型的响应? 像上面那样做正确的方法吗?

【问题讨论】:

    标签: node.js authentication express mongoose


    【解决方案1】:

    检查会话就足够了。服务器会话和客户端会话之间存在映射,这就是它足够安全的原因。当然,如果您想要“绝对”安全性(但不存在 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 数据。

    【讨论】:

    • 听说HTTP_X_REQUESTED_WITH可以通过代理删除,是吗?
    • 是的。代理可以对 HTTP 请求做任何事情。但除此之外,没有可靠的方法,因为任何东西都可以伪造/改变。另一种方法是检查Content-Type 标头,如果它要求application/json,则向其发送JSON 数据。
    • 谢谢。第一个问题是什么?
    • 在 Express 中,您可以使用 req.xhrreq.is('json')
    猜你喜欢
    • 2022-12-12
    • 1970-01-01
    • 2021-11-28
    • 2017-10-09
    • 2016-04-04
    • 2017-02-03
    • 2021-03-07
    • 2013-12-06
    • 1970-01-01
    相关资源
    最近更新 更多