我在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的有效期是否无限制?如果取消订阅,我可以使用哪个字段来识别订阅?
答案 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,并为自己的特定用例添加其他人