[英]Identifying users in Rails Web push notifications
我正在開發Rails應用程序,並且想在發生某些操作時向特定用戶發送Web推送通知,例如:
用戶開始跟蹤計時器,但是計時器已運行6個小時以上。 然后,該應用向該用戶發送網絡通知。
我一直在進行研究,發現了本教程 ,作者為Rails實現了推送通知,但是對於如何識別用戶並沒有任何見解。
據我了解,用戶需要從其瀏覽器訂閱才能獲得推送通知,但是,考慮到每個用戶都可以從多個瀏覽器使用該應用程序,我如何在他們使用的所有瀏覽器中自動為用戶訂閱/取消訂閱通知該應用來自何處?
因此,我所做的就是在User
模型中添加了notification_subscription
模型。
在我的JavaScript上,我檢查是否存在當前的瀏覽器訂閱:
this.serviceWorkerReady()
.then((serviceWorkerRegistration) => {
serviceWorkerRegistration.pushManager.getSubscription()
.then((pushSubscription) => {
if (pushSubscription && _.includes(subscriptionEndpoints, pushSubscription.endpoint)) {
return;
}
this.subscribe();
});
});
我檢查當前訂閱是否已存在於用戶存儲的端點中,如果沒有,則進行訂閱。
在訂閱時,我將新端點發送到后端,后端將新訂閱添加到用戶:
$.post(Routes.users_subscriptions_path({ format: 'json' }), {
subscription: subscription.toJSON()
});
然后,我可以向用戶發送通知到每個端點:
def push_notifications_to_user(user)
message = {
title: "A message!",
tag: 'notification-tag'
}
user.notification_subscriptions.each do |subscription|
begin
Webpush.payload_send(
message: JSON.generate(message),
endpoint: endpoint,
p256dh: p256dh,
auth: auth,
api_key: public_key
)
rescue Webpush::InvalidSubscription => exception
subscription.destroy
end
end
end
如果端點無效,則webpush gem會引發InvalidSubscription
異常,我們可以銷毀該端點以僅保留用戶的有效端點。
該端點在瀏覽器中是唯一的,因此您需要在應用程序頂部使用其他身份驗證方案,以將用戶信息與新端點一起發送。
將元數據(即用戶ID)存儲在服務器上時,需要將其附加到端點:
@subscription = Subscriptions.new endpoint: params[:endpoint]
@subscription.user = current_user
// or if you send with AJAX the user id together with the endpoint
@subscription.user = User.find params[:user_id]
在第二種情況下,我建議對用戶ID簽名或使用秘密令牌,否則任何人都可以訂閱推送通知,就好像它是另一個用戶一樣。
然后,您可以從數據庫中刪除屬於該用戶ID的所有端點,以取消訂閱其所有設備。
但是,我認為這不是一個好習慣:用戶可能希望在設備上而不是在另一台設備上接收通知。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.