【问题标题】:QuickBlox REST API unable to get push notification subscription listQuickBlox REST API 无法获取推送通知订阅列表
【发布时间】:2016-02-09 11:22:42
【问题描述】:

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

我已从 QB 管理面板检查我正在使用的用户有活动的推送通知订阅,但请求 GET api.quickblox.com/subscriptions.json 返回 404 未找到。

API 方法Retrieve subscriptions 的文档指出没有需要随请求一起传递的参数。它需要的唯一信息是在标头中传递的 QB-Token。令牌间接指定了登录用户,所以这就是它所需要的。

但是,方法的描述是

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

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

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

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

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

【问题讨论】:

  • 我也有同样的问题,你解决了吗?

标签: rest push-notification quickblox


【解决方案1】:

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

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

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

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

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

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

'application_id=22&auth_key=wJHd4cQSxpQGWx5&nonce=33432&timestamp=1326966962&user[login]=test@test.com&user[password]=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: "test@test.com",
     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]=test@test.com&user[password]=test123'

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

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

例如 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

我希望这可以帮助其他遇到此问题的人,因为我假设 Aleksi Grön 在 2 个月后解决了这个问题。

【讨论】:

  • 我以前没有找到解决我的问题的方法,但看起来可能就是这样。我确定了一个不理想但在大多数情况下都可以使用的解决方法。我在首次创建订阅信息时将其保存在本地,并在需要删除订阅时使用它。当用户在设备上拥有有效订阅时卸载应用程序时,信息会丢失。如果用户重新安装应用程序,我无法取回信息,也无法在他们注销时删除订阅。无论如何,感谢您在这件事上的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多