8

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

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

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

4

1 回答 1

8

如果您要设置的话,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);
});

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

于 2013-06-28T09:53:38.273 回答