wampv2 autobahn.js向客户群发布消息

时间:2016-03-13 10:58:34

标签: javascript node.js authentication autobahn

我正在使用wampv2并计划在我的项目中使用。 但是,有几件事我不知道如何处理。

我不知道如何发布订阅主题的客户群,而不是发布给所有订阅主题的客户。

一般问题:如何发布到特定客户?

我知道autobahn.js有一个API:     session.publish('com.myapp.hello',['Hello,world!'],{},{qualified:[123,456]});

但是,如何获取符合条件的数组的客户端ID?

我做了以下事情:

  1. 启动crossbar.io路由器

  2. 使用autobahn.js

  3. 编写nodejs客户端

    我正在尝试将此nodejs客户端作为发布者。

    以下是示例代码:

        var autobahn = require('autobahn'),
                _ = require('underscore'),
                md5 = require('md5');
        var connection = new autobahn.Connection({
            url: 'ws://127.0.0.1:8080/ws',
            realm: 'realm1'
        });
    
        var shared_secret = 'cflyhao';
        var userkeyToId = {};
    
        connection.onopen = function(session, details){
    
            var userAuth = function(args){
    
                var clientid = args[0];
                var userkey = args[1];
                var signature = args[2];
    
                if(isValidSignature(userkey, signature)){
    
                    if(!(_.has(userkeyToId, userkey))){
                        userkeyToId[userkey] = {};
                    }
    
                    userkeyToId[userkey][clientid] = clientid;
    
                    return true;
                }else{
                    return false;
                }
            };
    
            var userUnAuth = function(args){
                var clientid = args[0];
                var userkey = args[1];
                var signature = args[2];
    
                if(isValidSignature(userkey, signature)){
                    if(_.has(userkeyToId, userkey)){
                        delete userkeyToId[userkey][clientid];
                    }
                }
            };
    
            session.register('user.auth', userAuth);
            session.register('user.unauth', userUnAuth);
        };
    
        connection.open();
    
        function isValidSignature(userkey, signature){
    
            return signature == md5(userkey + shared_secret);
        }
    
    1. 也使用autobahn.js编写浏览器客户端。
    2. 我试图将此浏览器客户端用作接收器。

      以下是示例代码:

          var usersessionid = null;
          var userkey = "userkey1";
          var shared_secret = "cflyhao";
          var signature = md5(userkey + shared_secret);
          var connection = new autobahn.Connection({
                   url: 'ws://127.0.0.1:8080/ws',
                   realm: 'realm1'
                });
      
          connection.onopen = function (session, details) {
              usersessionid = session.id;
              session.call('user.auth', [session.id, userkey, signature]).then(function(res){
                  console.log('res', res);
              });
          };
      
          connection.onclose = function(reason, details){
      
              //this is not work
              //how to perform user.unauth, where to handle this
              usersession.call('user.unauth', [usersessionid, userkey, signature]).then(function(res){
                  console.log('oncloseres', res);
              });
          };
      
          connection.open();
      

      您可以看到我想在nodejs客户端中存储userkeyToID映射。 只要我可以获取userkeyToID映射,我就可以发布到特定的客户端。(假设我没有尝试错误的方式)

      浏览器客户端将调用'user.auth'来报告他的clientid。

      user.auth工作正常。 Howerver,不知道如何处理user.unauth,user.unauth负责从地图中删除断开连接的客户端。

      具体问题: 如何使user.unauth工作?

      请帮助解决一般性问题和具体问题。

      非常感谢提前!

0 个答案:

没有答案