破解 Mozilla Firefox 的 Web Push 錯誤訊息(上)

說明

本文是關於 Mozilla 內 Web 推播服務和 Web Push 使用方法的系列文章之一。作者的用意並非提供一般性的指引,而是對 Web Push 提供最佳使用方法的建議,並設定讀者對於 JavaScript、Python 或其他相關科技具基本的了解。

Web Push 實作上的一大挑戰是要找出問題點。Web Push 有大量的「可動部件」、系統和元件,所有的元素都必須彼此合作,才能成功完成訊息的推送和接收。雖然這篇文章無法一一說明導致推播通知失敗的原因,但會針對常見的問題提供實用的工具和建議。

常見問題

錯誤回報

最大宗的問題源自於網站忽略我們提供的 return codes。不久前我們在另一篇文章中便曾建議,你可透過訂閱服務減少發送失敗訊息的成本。花點心思留意系統傳回的狀態碼也是很重要的。

譬如,錯誤訊息的正文(body)可能是這樣:

{

‘errno’: 102,

‘message’: ‘Request did not validate invalid token’,

‘code’: 404,

‘more_info’: ‘http://autopush.readthedocs.io/en/latest/http.html#error-codes',

‘error’: ‘Not Found’

}

你可在 Autopush 文檔中找到錯誤值的清單(Autopush是我們用以執行接收和轉寄推播訂閱更新的開源伺服器的名字)。因為 Autopush 伺服器會盡可能提供詳細和有用的資料,所以,如果你有通知發不出去,Autopush 的訊息應該會很有幫助。

VAPID 的問題

另一個潛在問題點則與 VAPID 有關。VAPID 是能讓提供訂閱服務的網站「表明身分」的新興標準,也就是說,當重大問題發生時,推送服務的伺服器運營者便有辦法聯繫到問題通知的來源。假使你看到大量帶有 401 狀態碼的回應訊息,十之八九是因為 VAPID 驗證出了差錯。

VAPID 還能讓網站設定「限制性訂閱」。此做法能把訂閱鎖住,只允許擁有 VAPID 金鑰的人發送訂閱通知。箇中原理有點複雜。

但說得簡單點的話,VAPID 是以金鑰密碼簽署的資料區塊。此金鑰有兩個部分,其一是用以簽署 VAPID 代碼(token)、絕對不能分享給他人的私鑰;其二則是負責製作限制性訂閱、可透露給他人的公鑰。一般來說,VAPID 金鑰可以維持一段時間不變 — — 約一年左右,但絕不能萬年不變。請容我稍後進一步說明。

當你的應用程式提出推送端點請求時,你可以選擇把 VAPID 的公鑰當作應用伺服器金鑰(applicationServerKey)來提供。這會產生一個只有該金鑰能開啟的新訂閱端點。若要成功發送訂閱請求,你必須以相應的私鑰來簽署 VAPID 區塊,並在請求中包含公鑰(你在請求內加入公鑰的方式會因 Draft 01 及Draft 02有別。你或許會需要能輔助授權簽署的函式庫,也不妨先參考推播服務的文檔,了解一下其所接受的格式。大多數的推播平台都接受 Draft 02)。

請注意,VAPID 公鑰會跟你請求的 URL 綁在一起,也就是說,之後每當你想送資料給該 URL,都必須使用同樣的金鑰組合。假使你想換 VAPID 金鑰,就得先取得新端點後再刪除舊的。當然你有權決定如何處理。你的 app 可以從已知的位址取得新的公鑰、產生新的 URL 請求後,再把新的註冊資訊傳回給伺服器。這會使用到你在pushsubscriptionchange 事件上會用的大部分的程式碼。

出現 VAPID 401 錯誤時,你應該確認以下三點:

  1. 你是不是用同樣的金鑰組合來存取限制性訂閱的內容?
  2. 你是否已正確簽署 VAPID 授權金鑰?
  3. 你的請求是否涵蓋了所有必要的 VAPID 標頭?

原文連結

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.