Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Socket.IO进行授权和握手_Javascript_Node.js_Sockets_Socket.io_Authorization - Fatal编程技术网

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

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中授权和握手的主要功能是什么。我已经阅读了他们的wiki和GitHub,但我仍然不理解以下内容:

  • Socket.io中的授权是如何工作的
  • Socket.IO中的握手是什么
  • 我可以向
    握手数据
    对象添加任何内容吗

  • 我希望你能回答我的问题。谢谢。

    编辑:在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,但它仍然可以工作。它可以工作,但不推荐使用。使用中间件。