我想知道 Socket.IO 中授权和握手的主要功能是什么。我已经在 GitHub 上阅读了他们的 wiki 和授权指南,但我仍然不明白以下内容:
- Socket.io 中的授权是如何工作的?
- Socket.IO 中的握手是什么?
- 我可以向
handshakeData
对象添加任何内容吗?
我希望你能回答我的问题。谢谢。
我想知道 Socket.IO 中授权和握手的主要功能是什么。我已经在 GitHub 上阅读了他们的 wiki 和授权指南,但我仍然不明白以下内容:
handshakeData
对象添加任何内容吗?我希望你能回答我的问题。谢谢。
编辑:在 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
数据对象中传递的数据很有帮助。
要回答您的最后一个问题,是的,您可以在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
});
这非常有用,因为您可以存储基于套接字的属性。一个常见的用途是使用 Express 框架,其中可以根据 Socket.IO 传递的 cookie 识别会话 ID,然后可以识别匹配的会话。
从 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;
});
在客户端,要将您自己的属性添加到握手中,它看起来像这样:
var joinServerParameters = { token: "xxx" };
var socket = io.connect('url' , {query: 'joinServerParameters=' + JSON.stringify(joinServerParameters) });
现在我正在使用这个简单的方法:
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 的握手授权的非常好的文章中添加信息。
在这种情况下
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 将给出 undefined
我们需要在这里调用socket.request.foo以获得正确的值
有人误导了我们,因为 io auth 中间件采用 2 个带有PROPER NAMES 的参数,如下所示(请求、回调)而不是(握手、回调) PS:idk 可能以前的 io 版本有第二种情况 :)
io.set('authorization', function (request, callback) {
request.foo = 'bar';
callback(null, true);
});