2017-02-28 96 views
2

我实现了一个网络推式API与此谷歌教程的帮助: https://developers.google.com/web/fundamentals/getting-started/codelabs/push-notifications/网络推式API - 存储在订阅后端

本教程包括一个方法,它可以用来订阅发送到后端服务器:

function updateSubscriptionOnServer(subscription) { 
    // TODO: Send subscription to application server 
    ... 
} 

我想存储订阅与用户标识符,所以我可以选择哪些用户我想发送通知。现在我想知道,我要将哪部分订阅存储在数据库中。我的订阅对象是这样的:

{"endpoint":"https://fcm.googleapis.com/fcm/send/...","keys":{"p256dh":"...","auth":"..."}} 

我应该创建一个表“订阅”的列(ID | USER_ID |订阅),它包括整个JSON订阅?最佳做法是什么? JSON的有效性是无限的吗?如果取消订阅,我可以使用哪个字段来识别订阅?

+0

我正在存储整个JSON,但我也难以理解如何在用户取消订阅时删除订阅行。 – Flimm

回答

0

要允许匿名网络推用户使用我们的服务,我们已经想出了主意,哈希认购,并使用哈希作为后端的主键(ID)。

// pseudo-code 
const id = hash(subscription); 
https.post(`${SERVER}/subscription/${id}`, subscription).then(...); 

据我所知,正确的订阅不会随着时间而改变,因此,散列是一个常数。由于每个订阅都是唯一的,因此不会预期冲突,因此您可以选择适当的散列函数(例如SHA-512)。

只要您可以访问原始订阅并重新创建哈希/ ID,您就可以重新验证服务工作者中的订阅或处理pushsubscriptionchange事件。

这应该涵盖大部分情况。但是,当通过Google和Firefox的推送服务器发送推送通知时,您仍然需要尊重无效订阅的响应代码(HTTP 401),并将其从数据库中删除。

查看Javascript Crypto functionality了解可用的散列函数。 FF和Chrome支持。