Web Push API - 在后端

时间:2017-02-28 09:39:56

标签: push-notification push-api

我在Google教程的帮助下实现了一个Web Push API: https://developers.google.com/web/fundamentals/getting-started/codelabs/push-notifications/

本教程包含一个方法,可用于将订阅发送到后端服务器:

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

我想将订阅与用户标识符一起存储,因此我可以选择要向其发送通知的用户。现在我想知道,我要在数据库中存储订阅的哪一部分。我的订阅对象如下所示:

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

我是否应该使用列(Id | User_Id | Subscription)创建一个表“Subscription”,其中包含整个JSON订阅?那是什么最佳做法? JSON的有效期是否无限制?如果取消订阅,我可以使用哪个字段来识别订阅?

2 个答案:

答案 0 :(得分:3)

为了允许匿名网络推送用户使用我们的服务,我们提出了哈希订阅的想法,并将哈希用作后端的主键( 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支持。

答案 1 :(得分:0)

将您的订阅存储在数据库中

如果您使用的是文档数据库,您的数据库应该看起来像这样:

userId: {type:String, required: true},
endpoint: { type: String, unique: true},
keys: {
 p256dh: {type: String},
 auth: {type: String}
},
userAgent: {type: String}, // optional, just an additional tracking field
deviceId: {type: String} // just additional tracking fields

如果您使用的是关系数据库,则可以将keys部分存储在单独的列中,也可以使用JSON类型的列。

主要要了解的是webpush.sendNotification(...)带有以下接口的对象:

export interface PushSubscription {
    endpoint: string;
    keys: {
        p256dh: string;
        auth: string;
    };
}

这基本上意味着这些是数据库跟踪预订所需要的属性。您可以选择添加userId,并为自己的特定用例添加其他人