我想知道 Socket.IO 中授权和握手的主要功能是什么。我已经阅读了他们的 wiki 和 authorizing guide在 GitHub 上,但我仍然不明白以下内容:
- 在 Socket.io 中授权是如何工作的?
- Socket.IO 中的握手是什么?
- 我可以向
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 中的授权是通过一个函数运行的,该函数由回调传递的 bool 值决定。每次连接尝试握手时都会运行此函数,如下所示:
io.set('authorization', function (handshake, callback) {
callback(null, true);
});
callback()
函数接受两个参数。第一个是错误原因(如果有),第二个参数是决定客户端是否可以连接的 bool 值。默认情况下是没有授权的,所以场景如上面的代码示例所示,其中正在连接的套接字允许通过 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 识别 session ID,然后可以识别匹配的 session 。
关于javascript - 使用 Socket.IO 进行授权和握手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19106861/