javascript - 使用 Socket.IO 进行授权和握手

标签 javascript node.js sockets socket.io authorization

我想知道 Socket.IO 中授权和握手的主要功能是什么。我已经阅读了他们的 wiki 和 authorizing guide在 GitHub 上,但我仍然不明白以下内容:

  1. 在 Socket.io 中授权是如何工作的?
  2. Socket.IO 中的握手是什么?
  3. 我可以向 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/

相关文章:

javascript - 是否可以使用快速路线正则表达式中的捕获组?

node.js - req.body 在帖子上为空

c - 如何使用 C 套接字 ping

laravel - 如何在Ubuntu Server 18.04中使用系统启动来运行网络套接字?

javascript - 对象不支持属性或方法 'addEventListener'

javascript - d3 圆环图弧检索错误数据

javascript - Grunt/Babel 错误 : Unable to write "dist" file (Error code: EISDIR)

javascript - React router dom无法获取页面

node.js - 使用 Lambda 代理的 API 网关设置 Cookie

python - 何时以及为何 socket.send() 在 python 中返回 0?