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

标签 node.js session authentication express

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

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

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

最佳答案

如果您设置的话,express 中的 session 将使用 cookie。它将交换用于在服务器端触发 session 恢复的长 key 。
服务器端的 session 数据不会通过 cookie 与客户端共享。您可以在服务器端启用 session 的页面请求的响应 header 中验证这一点。
Socket.IO 有能力在握手过程中恢复 session 数据,因为它作为正常的 HTTP 请求开始,并且交换 cookie,除了用于 session 恢复的另一个验证之外,还用于验证用户的身份。

只要被盗的 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 的最后一个函数功能相同,因此您可以从中访问 session 数据并且如果有效,可以调用 next(),或者 next(new Error('reason')); 不会继续中间件链到最后一个函数,但会弹出out 到处理错误的路由。
如果您有应该尝试回退的路由链,那么您可能不想返回 next(new Error()); 而不是返回 中的 allowed 标志req 某处,然后检查最后一个路由回调以检查它是否被 allowed 如果不是 - 调用 next() 将尝试找到另一条适合的路由查询。

关于node.js - 最安全的 node.js/express 认证机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17361593/

相关文章:

java - Google App Engine - 调用 getSession().invalidate();导致 App Engine 表现怪异

php - 如何在 PHP 中使用登录 cookie 连接用户?

node.js - NodeJs中如何使用多线程?

node.js - 使用 NPM 为私有(private)存储库添加版本号注释

javascript - 我看到了 Node 模式,但不明白为什么?

javascript - 快速 session Cookie 管理

model-view-controller - 在 MVC 中 - session 处理和身份验证是否由用户模型处理?

java - 为多个用户创建多个 Connection 对象

java - 在java中验证基于linux的用户

javascript - Angular.js+nw.js+webpack+karma+jasmine如何测试