Javascript 使用Socket.IO进行授权和握手
我想知道Socket.IO中授权和握手的主要功能是什么。我已经阅读了他们的wiki和GitHub,但我仍然不理解以下内容:Javascript 使用Socket.IO进行授权和握手,javascript,node.js,sockets,socket.io,authorization,Javascript,Node.js,Sockets,Socket.io,Authorization,我想知道Socket.IO中授权和握手的主要功能是什么。我已经阅读了他们的wiki和GitHub,但我仍然不理解以下内容: Socket.io中的授权是如何工作的 Socket.IO中的握手是什么 我可以向握手数据对象添加任何内容吗 我希望你能回答我的问题。谢谢。编辑:在Socket.IO 1.0中,现在使用中间件。授权可以这样做: io.use(function(socket, next) { var handshake = socket.request; next(); }); 如
握手数据
对象添加任何内容吗我希望你能回答我的问题。谢谢。编辑:在Socket.IO 1.0中,现在使用中间件。授权可以这样做:
io.use(function(socket, next) {
var handshake = socket.request;
next();
});
如果需要拒绝套接字,只需将错误对象传递给next()
回调。使用名称空间也可以执行相同的操作:
io.of('/namespace').use(function(socket, next) {
var handshake = socket.request;
next();
});
Socket.IO中的授权通过一个函数运行,该函数由回调传递的布尔值决定。每次连接尝试握手时,此函数都会运行,如下所示:
io.set('authorization', function (handshake, callback) {
callback(null, true);
});
函数callback()
接受两个参数。第一个参数是错误原因(如果有),第二个参数是决定客户端是否可以连接的布尔值。默认情况下没有授权,因此上面的代码示例中显示了该场景,其中允许连接的套接字通过true
Socket.IO中的握手与任何其他与信息技术相关的握手一样。这是协商的过程,在Socket.IO的情况下,协商决定客户端是否可以连接,如果不可以,则拒绝连接。握手是通过XHR或JSONP请求启动的,在未指定授权的情况下没有多大作用,但在handshake
数据对象中传递的数据中可能会有所帮助
要回答上一个问题,可以,您可以在握手
对象中添加任何内容。对象是对socket.handshake
对象的同一变量引用,它允许您执行以下操作:
io.set('authorization', function (handshake, callback) {
handshake.foo = 'bar';
callback(null, true);
});
io.sockets.on('connection', function(socket) {
console.log(socket.handshake.foo); // bar
});
var joinServerParameters = { token: "xxx" };
var socket = io.connect('url' , {query: 'joinServerParameters=' + JSON.stringify(joinServerParameters) });
这非常有用,因为您可以存储基于套接字的属性。这种方法的一个常见用法是在Express framework中,可以根据Socket.IO传递的cookies来识别会话ID,然后可以识别匹配的会话。现在我使用的是以下简单方法:
io.set('authorization', function (handshakeData, accept) {
var domain = handshakeData.headers.referer.replace('http://','').replace('https://','').split(/[/?#]/)[0];
if('myDomain.com'==domain)
accept(null, true);
else
return accept('Deny', false);
});
自Socket.io 1.0以来,尽管存在向后兼容性,但建议使用“io.use()”来添加临时中间件,因此在节点服务器端:
io.use(function(socket, next){
var joinServerParameters = JSON.parse(socket.handshake.query.joinServerParameters);
if (joinServerParameters.token == "xxx" ){
next();
} else {
//next(new Error('Authentication error'));
}
return;
});
在客户端,要将您自己的属性添加到握手中,如下所示:
io.set('authorization', function (handshake, callback) {
handshake.foo = 'bar';
callback(null, true);
});
io.sockets.on('connection', function(socket) {
console.log(socket.handshake.foo); // bar
});
var joinServerParameters = { token: "xxx" };
var socket = io.connect('url' , {query: 'joinServerParameters=' + JSON.stringify(joinServerParameters) });
我知道这已经太迟了,但我想在这里添加一些信息,我发现了一篇关于使用socket.io进行握手授权的非常好的文章 在这种情况下
io.set('authorization', function (handshake, callback) {
handshake.foo = 'bar';
callback(null, true);
});
io.sockets.on('connection', function(socket) {
console.log(socket.handshake.foo); // bar
});
socket.handshake.foo将给出未定义的
我们需要在这里调用socket.request.foo以获得正确的值
有人误导了我们,因为io认证中间件采用了两个带有专有名称的参数,如下所示(请求、回调)不是(握手、回调)PS:idk可能以前的io版本有第二种情况:)
谢谢兄弟。这就是我想要的答案。:)这值得更多人喜欢。简单的事实是,握手可以通过socket进行。socket事件中的握手非常有用代码>–如何获取有关我在客户端中的连接被拒绝的信息?我无法从中间件发出.emit(),因为
next(新错误(“”))
拒绝进一步通信。虽然有点晚,但您可以在客户端套接字上侦听Error
事件,因为如果next(新错误(“禁止”),服务器会向客户端发送错误消息
被调用。io.set
方法早在1.1版时就被删除了。还有什么替代方法?我使用的是2.3.0,但它仍然可以工作。它可以工作,但不推荐使用。使用中间件。