我一直在使用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是什么,因此我可以在用户注销时删除它。
答案 0 :(得分:3)
好的,我已经设法解决了这个问题,我也被文档弄糊涂了,并没有明确解释它的含义
检索中指定的设备的订阅 授权令牌。
由于本文档的措辞模糊,我也遇到了让用户注册订阅的问题。
为了获取Quickblox的授权令牌(用于会话或用户会话),您必须先使用文档中描述的参数生成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个月后解决了这个问题。