2017-02-28 39 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支持。