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

亚历山大·格伦(AleksiGrön)

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

我已经从QB管理控制台中检查到我正在使用的用户具有活动的推送通知订阅,但是该请求GET api.quickblox.com/subscriptions.json返回404找不到。

API方法“检索订阅”的文档指出,不需要随请求传递任何参数。它需要的唯一信息是在标头中传递的QB-Token。该令牌间接指定了已登录的用户,因此这就是它所需要的全部。

但是,该方法的说明是

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

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

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

获取404之后,我尝试为用户为当前设备创建一个新订阅如果设备已经存在订阅,则POST api.quickblox.com/subscriptions.json返回201表示成功,但响应正文为[]如果以前没有该设备的订阅,则请求返回201,但是响应正文包含创建的订阅的信息。

我能够正常创建和删除通知事件,并将它们传递到设备。我的问题是,我无法轻松确认设备是否具有有效的订阅,并且我不知道该订阅的ID是什么,因此我可以在用户注销时将其删除。

本·麦克斯菲尔德

好的,我已经设法解决了这个问题,我也对文档感到困惑,它并不能清楚地解释其含义。

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

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

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

  • application_id(API应用程序标识符)
  • auth_key(AuthenticationKey)
  • 时间戳(Unix时间戳)
  • 随机数(Unix时间戳)
  • 用户登录]
  • 用户密码]
  • 签名(HMAC SHA1,如下所述)

使用这些参数及其值,您应该创建了一个类似于以下内容的字符串:

'application_id = 22&auth_key = wJHd4cQSxpQGWx5&nonce = 33432&timestamp = 1326966962&user [登录] [email protected]&user [密码] = test123'

然后HMAC SHA1使用您的应用程序密码作为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

例如POST,以/session.json

{  
   "application_id":"2",
   "auth_key":"DtF9cZPqTF8Wy9Q",
   "timestamp":"1333630392",
   "nonce":"1236221330",
   "user":
   {
     login: "[email protected]",
     password: "test123"
   },
   "signature":"eb0ec2d8c8184a3e62b41da2afb6e8d690577fa4"
}

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

解决您的问题

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

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

我们缺少的元素是将设备参数添加到授权令牌中,这在文档中根本无法描述

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

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

'application_id = 22&auth_key = wJHd4cQSxpQGWx5&device [platform] = android&device [udid] = 2374682h23780239j&nonce = 33432&timestamp = 1326966962&user [login] [email protected]&user [password] = test123'

请注意,如果以不同的顺序放置密钥,则会收到“意外签名”错误,device [platform]必须在auth_key等之后出现...

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

例如POST,以/session.json

{  
   "application_id":"2",
   "auth_key":"DtF9cZPqTF8Wy9Q",
   "timestamp":"1333630392",
   "nonce":"1236221330",
   "user":
   {
     login:"[email protected]",
     password:"test123"
   },
   "device":
   {
     "platform":"android",
     "udid":"2374682h23780239j"
   }
   "signature":"5t4d2d8c81848b6c4s41da2afb6e8d690889bc4"
}

QB-Token使用以下命令请求订阅时,将从Quickblox获取的令牌用作标头值:GET /subscriptions.json

在获得票证并搜寻互联网之后,我设法跌倒了这段代码并研究了一会儿,从而找到了这个解决方案。

使用Quickblox的Blackberry PushAuth的源代码

我希望这对其他坚持下去的人有所帮助,因为我认为AleksiGrön在2个月后已经解决了这个问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章