簡體   English   中英

在Rails Web推送通知中識別用戶

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM