QuickBlox REST API无法获取推送通知订阅列表

时间:2016-02-09 11:22:43

标签: rest push-notification quickblox

我一直在使用QuickBlox向iOS和Android上的应用发送推送通知。我使用Marmalade C ++ SDK开发应用程序。我在登录用户获取活动推送通知订阅时遇到问题。

我已经从QB管理面板检查过我使用的用户是否有活动推送通知订阅,但请求router.post('/addlog', multipartMiddleware, controller.postLog.bind(controller)); 返回404未找到。

API方法Retrieve subscriptions的文档指出,不需要随请求传递参数。它需要的唯一信息是在标题中传递的QB-Token。令牌间接指定登录用户,因此只需要它就可以了。

但是,该方法的描述是

  

检索授权令牌中指定的设备的订阅。

但这不可能完全正确,因为无法知道哪个设备正在发出请求。我认为它意味着检索用户的订阅。

在我们的应用程序中,检索订阅请求在登录用户后立即执行。我已确认登录成功,其他API方法正常运行。

获得404后,我尝试create a new subscription为用户提供当前设备。如果设备已存在订阅,GET api.quickblox.com/subscriptions.json将返回201表示成功,但响应正文仅为POST api.quickblox.com/subscriptions.json。如果先前没有订阅设备,则请求返回201,但响应正文包含创建的订阅信息。

我可以很好地创建和删除通知事件,并将它们传送到设备就好了。我的问题是,我无法轻易确认设备是否具有有效订阅,并且我无法知道该订阅的ID是什么,因此我可以在用户注销时删除它。

1 个答案:

答案 0 :(得分:3)

好的,我已经设法解决了这个问题,我也被文档弄糊涂了,并没有明确解释它的含义

  

检索中指定的设备的订阅   授权令牌

由于本文档的措辞模糊,我也遇到了让用户注册订阅的问题。

为了获取Quickblox的授权令牌(用于会话或用户会话),您必须先使用文档中描述的参数生成HMAC SHA1签名:

  • application_id(API应用程序标识符)
  • auth_key(AuthenticationKey)
  • 时间戳(Unix时间戳)
  • nonce(Unix时间戳)
  • 用户[登录]
  • 用户[口令]
  • 签名(HMAC SHA1,如下所述)

使用这些参数及其值,您应该创建一个如下所示的字符串:

  

'APPLICATION_ID = 22&安培; AUTH_KEY = wJHd4cQSxpQGWx5&安培;随机数= 33432&安培;时间戳= 1326966962&安培;用户[登录] =test@test.com&用户[口令] = test123'

然后HMAC SHA1使用您的app secret作为HMAC秘密来获取该请求的签名,例如: C#

        using (HMACSHA1 hmac = new HMACSHA1(Encoding.ASCII.GetBytes(secret)))
        {
            hmac.Initialize();
            byte[] buffer = Encoding.ASCII.GetBytes(value);
            return BitConverter.ToString(hmac.ComputeHash(buffer)).Replace("-", "").ToLower();
        }

获得此签名后,您可以将请求发送到Quickblox以获取授权令牌,对于此示例,它是用户会话的令牌。

您需要在请求正文中发送用于生成签名的所有参数,包括生成的签名,并POST将其发送到端点/session.json

E.g。 POST/session.json

{  
   "application_id":"2",
   "auth_key":"DtF9cZPqTF8Wy9Q",
   "timestamp":"1333630392",
   "nonce":"1236221330",
   "user":
   {
     login: "test@test.com",
     password: "test123"
   },
   "signature":"eb0ec2d8c8184a3e62b41da2afb6e8d690577fa4"
}

您获得的响应应具有我们用户会话请求所需的授权令牌。

解决您的问题

正如您所提到的,此令牌不适用于检索用户订阅,并返回未找到的令牌,尽管订阅了已存在且已链接到用户的推送通知。

发生这种情况的原因是因为用户与设备之间存在1:M关系,而Quickblox不会返回所有订阅,只返回与请求所源自的特定设备有关的订阅,但您必须告诉它。

我们所缺少的元素是将设备参数添加到授权令牌中,这在文档中非常糟糕地描述了,如果有的话

为了使其正常运行,我们需要将device[udid]device[platform]添加到授权请求中。这可以识别用户以及他们用于Quickblox的特定设备。

为此,请执行与上述相同的操作,但HMAC SHA1的值现在应该如下所示

  

“APPLICATION_ID = 22&安培; AUTH_KEY = wJHd4cQSxpQGWx5&安培;设备[平台] =机器人&安培;设备[UDID] = 2374682h23780239j&安培;随机数= 33432&安培;时间戳= 1326966962&安培;用户[登录] =test@test.com&用户[口令] = test123'

请注意,如果您按其他顺序放置密钥,您将收到“意外签名”错误,设备[平台]必须在auth_key等之后...

使用此字符串生成签名,然后使用与上述类似的请求发送:

E.g。 POST/session.json

{  
   "application_id":"2",
   "auth_key":"DtF9cZPqTF8Wy9Q",
   "timestamp":"1333630392",
   "nonce":"1236221330",
   "user":
   {
     login:"test@test.com",
     password:"test123"
   },
   "device":
   {
     "platform":"android",
     "udid":"2374682h23780239j"
   }
   "signature":"5t4d2d8c81848b6c4s41da2afb6e8d690889bc4"
}

然后,当您使用以下命令请求订阅时,您从Quickblox返回的令牌应该用作QB-Token标头值: GET /subscriptions.json

在提高门票并搜索互联网之后,我设法找到了这个解决方案,绊倒了这段代码并研究了一段时间。

Sourcecode for Blackberry PushAuth using Quickblox

我希望这可以帮助那些坚持这个的人,因为我认为AleksiGrön在2个月后解决了这个问题。