2017-06-20 36 views
0

我在服务器端实现了PAM,为此我尝试使用不同的授权密钥访问个人客户端。写入访问按预期工作,但即使我授予他们读取访问权限,客户端也不会收到任何消息。以下是我如何初始化我的pubnub配置;pubnub.grant()读取权限在PUBNUB中不起作用PAM

pnconfig = PNConfiguration() 
pnconfig.subscribe_key = 'sub-c-...' 
pnconfig.publish_key = 'pub-c-...' 
pnconfig.secret_key = "sec-c-..." 
pnconfig.uuid = "server" 
channel = "my_channel" 
pubnub = PubNub(pnconfig) 

def my_publish_callback(envelope, status): 
    #print 'status:', status.original_response 
    pass 


class MySubscribeCallback(SubscribeCallback): 
    def status(self, pubnub, status): 
     if status.is_error(): 
      print("handle permissions here ERROR") 
      if status.category == PNStatusCategory.PNAccessDeniedCategory: 
       print("handle permissions here") 

    def message(self, pubnub, message): 
     global server_UUID 
     d = message.message 
     if type(d) == dict: 
      if (d.get('server')): 
      pass 
      else: 
       print 'dict>>',d 
     else: 
      print 'got>>', d 

pubnub.add_listener(MySubscribeCallback()) 
pubnub.subscribe().channels(channel).with_presence().execute() 

def input_take(): 
    while 1: 
     data = raw_input("Send:") 
     if "yes" in data: 
      grant(True, True, "robot") 
     elif "no" in data:  
      grant(False, False, "robot") 

def send(): 
    c = 0 
    while 1: 
     print 'sending:', c 
     time.sleep(1.5) 
     c += 1 
     pubnub.publish().channel(channel).message({pubnub.uuid:str(c)}).async(my_publish_callback)  

def grant(read, write, auth):   
     v=pubnub.grant()\ 
      .read(read)\ 
      .write(write)\ 
      .channels('my_channel')\ 
      .auth_keys(auth)\ 
      .ttl(60)\ 
      .sync() 
     #print v.result 
     for key, value in v.status.original_response.iteritems(): 
      print key ,":" , value 
      pass 

T = Thread(target=input_take) 
T.start() 
S = Thread(target=send) 
S.start() 

运行pubnub.grant()函数时,状态响应为200。

status : 200 
message : Success 
payload : {u'auths': {u'robot': {u'r': 1, u'm': 0, u'w': 1}}, u'subscribe_key': u'sub-c-...', u'ttl': 60, u'channel': u'my_channel', u'level': u'user'} 
service : Access Manager 

但仍然没有客户端能够收到任何消息。我正在使用pubnub调试控制台进行客户端测试,并设置与服务器“robot”中相同的授权密钥。我错过了什么吗?或者我需要在PAM中配置一些东西?我正在使用PubNub版本4.0.12。

+0

我观察过读访问的行为。当授予对False的读取访问权时,实际上是从该特定频道取消订阅客户端。因此,如果您想要再次获得读取权限,则客户端需要再次订阅该频道才能收听消息。 –

+0

我之所以不查看收到的邮件是因为客户端自动取消订阅。所以当我再次订阅时,我可以成功读取消息。 –

回答

0

按照我上面的评论。我在客户端添加了一个JavacScript代码,该代码尝试在每两秒钟后重新订阅该频道。

function try_sub(){ 
    pubnub.subscribe({ 
     channels: ['my_channel'] 
    }, 

    function (status, response) { 
     if (status.error) { 
      console.log(status) 
     } else { 
      console.log("Subscribed Success w/ timetoken", response.timetoken) 
     } 
    }  

    ); 
    setTimeout('try_sub()',2000); 
    } 
+0

是无限的还是直到成功? –

+0

@CraigConover之前是无限的,但现在我已经添加了一张支票。如果我在订阅回调函数中“禁止”,则运行此try_sub()函数,否则请闲置。 –