最安全的node.js / express认证机制

时间:2013-06-28 09:33:29

标签: node.js session authentication express

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

  1. 用户已通过用户名&amp ;;进行身份验证密码
  2. 安装了带会话支持的快递我使用request.session对象来存储所有用户的信息和凭据,每次新呼叫从同一个用户进入服务器时我都会检查它/ LI>

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

1 个答案:

答案 0 :(得分:7)

快递会议将使用cookies,如果您将设置。它将交换用于在服务器端触发会话恢复的长密钥 服务器端的会话数据不通过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'));不会继续使用中间件链接到最后一个功能,但会弹出以处理错误的路由。
如果您有应该尝试回退的路由链,那么您可能希望在next(new Error());某处有allowed的标记而不是返回req,然后检查最后一个路由回调以检查如果不是allowed,则调用next(),尝试找到适合查询的其他路线。