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

And*_*dis 7 authentication session node.js express

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

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

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

mok*_*oka 7

快递会议将使用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);
});
Run Code Online (Sandbox Code Playgroud)

中间件是同样的功能,接受作为最后一个函数req,res并且next,这样你就可以从中获取会话数据,并可以调用next()是否有效的情况下,或next(new Error('reason'));不会继续中间件最后一个函数链,但会蹦出路由手柄错误.
如果您有应该尝试回退的路由链,那么next(new Error());您可能希望allowedreq某个地方拥有标志,而不是返回,然后检查最后一个路由回调以检查它是否是 - allowed如果没有则调用next()它将尝试找到另一个路径适合查询.