我想用 express 开发一个 node.js 应用程序。该应用程序将支持多个访问级别。所有用户都将通过用户名和密码进行身份验证。 到目前为止,我一直在使用的身份验证方法如下:
- 用户已通过用户名和密码进行身份验证
- 安装了具有 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);
});
中间件与接受req
、res
和next
的最后一个函数功能相同,因此您可以从中访问 session 数据并且如果有效,可以调用 next()
,或者 next(new Error('reason'));
不会继续中间件链到最后一个函数,但会弹出out 到处理错误的路由。
如果您有应该尝试回退的路由链,那么您可能不想返回 next(new Error());
而不是返回 中的
某处,然后检查最后一个路由回调以检查它是否被 allowed
标志reqallowed
如果不是 - 调用 next()
将尝试找到另一条适合的路由查询。
关于node.js - 最安全的 node.js/express 认证机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17361593/