【问题标题】:Most secure node.js / express authentication mechanism最安全的 node.js / express 认证机制
【发布时间】:2013-06-26 01:02:12
【问题描述】:

我想用 express 开发一个 node.js 应用程序。该应用程序将支持多个访问级别。所有用户都将通过用户名和密码进行身份验证。 到目前为止我一直在使用的认证方法如下:

  1. 用户已通过用户名和密码进行身份验证
  2. 安装了带会话支持的 express 后,我使用 request.session 对象来存储所有用户的信息和凭据,并且每次来自同一用户的新呼叫进入服务器时,我都会检查它

这个过程有多安全?它使用cookies吗?它有漏洞吗?通过 websockets 和 socket.io 或任何其他不同方式控制会话是否更安全? 提前致谢

【问题讨论】:

    标签: node.js session authentication express


    【解决方案1】:

    如果您愿意,Express 中的会话将使用 cookie。它将交换用于在服务器端触发会话恢复的长密钥。
    服务器端的会话数据不通过 cookie 与客户端共享。您可以在响应在服务器端启用会话的页面请求的标头中验证这一点。
    Socket.IO 有能力在握手过程中恢复会话数据,因为它以正常的 HTTP 请求开始,并交换 cookie,用于验证用户身份以及用于会话恢复的另一个验证。

    这是非常有效和安全的,因为被盗的 cookie 不会提供从另一个远程端点和浏览器访问的能力。

    为了使不同的用户类型具有不同的访问限制,我使用了在路由声明中非常方便的中间件函数。
    从编码的角度来看,它们可能看起来像这样:

    var userTypes = {
      any: function(types) {
        return function(req, res, next) {
          if (types.indexOf(req.session.user.type) != -1) {
            return next();
          } else {
            return next(new Error('permission denied'));
          }
        }
      },
      is: function(type) {
        return function(req, res, next) {
          if (req.session.user.type == type) {
            return next();
          } else {
            return next(new Error('permission denied'));
          }
        }
      }
    }
    
    app.get('/items', userTypes.any([ 'developer', 'admin' ]), function(req, res, next) {
      // will execute if user type is developer or admin
    });
    
    app.use(function(err, req, res, next) {
      console.log(err);
      res.send(err);
    });
    

    中间件与接受reqresnext的最后一个函数具有相同的功能,因此您可以从中访问会话数据,如果有效,可以调用next(),或next(new Error('reason'));不会将中间件链延续到最后一个函数,但会弹出处理错误的路由。
    如果您有应该尝试回退的路由链,那么您可能希望在req 某处拥有allowed 的标志,而不是返回next(new Error());,然后检查最后一个路由回调以检查它是否为allowed如果不是,请致电next(),它将尝试找到适合查询的另一条路线。

    【讨论】:

    • 谢谢。非常好的任何/是示例。我会完全使用它。尽管我不明白您所指的方法是“只要被盗的 cookie 不会提供从另一个远程端点和浏览器访问的能力”,这样做非常有效且安全。你提到了 session 和 socket.io。如果我理解错误,请纠正我。你的意思是我最初的问题中描述的标准方法是可以的,只要我不在 express 会话中使用 cookie?
    • 关于快速会话存储 - 它是 node.js 私有的,不会通过 cookie 左右共享。尽管为了安全地恢复会话,会有带有长“散列 id”的 cookie(这发生在节点的幕后)。在会话对象中存储有关当前会话的临时数据是完全可以的。如果您自己将其存储在对象中,键为 session.id,则几乎相同。虽然不在会话中存储密码。根据您的应用程序的逻辑,密码永远不会超出数据库。
    猜你喜欢
    • 2011-05-12
    • 2016-04-28
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    相关资源
    最近更新 更多