我想用express开发一个node.js应用程序。该应用程序将支持多个访问级别。所有用户都将通过用户名&密码。 我到目前为止使用的身份验证方法如下:
这个过程有多安全?它使用cookies吗?它有漏洞吗?通过websockets和socket.io或任何其他不同方式控制会话更安全吗? 提前致谢
答案 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);
});
中间件与接受req
,res
和next
的最后一项功能功能相同,因此您可以从中访问会话数据,并可以调用next()
以防万一如果有效,或next(new Error('reason'));
不会继续使用中间件链接到最后一个功能,但会弹出以处理错误的路由。
如果您有应该尝试回退的路由链,那么您可能希望在next(new Error());
某处有allowed
的标记而不是返回req
,然后检查最后一个路由回调以检查如果不是allowed
,则调用next()
,尝试找到适合查询的其他路线。