常見問題及回報錯誤

Matt Gaunt

網頁推送發生問題時,可能難以偵錯,或是 尋求協助。本文件將概述一些常見問題,以及您應採取的行動 如果您在 Chrome 或 Firefox 中發現錯誤,請進行更新。

在深入探索推送偵錯功能之前,您可能無法順利進行偵錯 Service Worker 本身,檔案並未更新、無法註冊 通常只是異常行為另有 有關對 Service Worker 偵錯的詳盡文件 我強烈建議您確認自己是新手 Service Worker 開發作業。

開發及測試網路推送時,應檢查 2 個不同的階段 每個問題都有專屬的一組常見問題

  • 傳送訊息:確認訊息傳送成功。 您應該會收到 201 HTTP 代碼。如果您不使用 :
    • 檢查授權錯誤:如果您收到授權 錯誤訊息 授權問題部分
    • 其他 API 錯誤:如果您收到 201 以外的狀態碼回應, 請參閱 HTTP 狀態碼部分, 說明問題原因
  • 接收訊息:如果您可以成功傳送訊息, 但瀏覽器並未收到訊息:

如果您無法收發推送訊息,也無法收到相關部分 無法協助偵錯問題,那麼您可能會發現 推送機製本身發生的錯誤在此情況下,請參閱 提高錯誤報告 一節,提交一份詳盡的錯誤報告,並附上所有必要資訊,加快處理速度 錯誤修正程序。

開始前,我想先介紹一下 Firefox 和 Mozilla AutoPush Service 有出色的錯誤訊息。如果遇到困難 不確定有問題的部分,請在 Firefox 中進行測試,看看是否 取得更實用的錯誤訊息

授權問題

授權問題是開發人員在 從網路推播開始這通常是因為 網站的應用程式伺服器金鑰 (又稱 VAPID 金鑰)

如要透過 Firefox 和 Chrome 支援推送功能,最簡單的方法就是提供 subscribe() 呼叫中的 applicationServerKey。缺點是 您的前端與伺服器金鑰之間的任何差異都會導致 授權錯誤。

Chrome 和 FCM

如果是使用 FCM 做為推送服務的 Chrome, FCM 針對不同範圍發表 UnauthorizedRegistration 則回覆 這全都牽涉到應用程式伺服器金鑰

您會在以下任一情況收到 UnauthorizedRegistration 錯誤 情境:

  • 如果您無法在向 FCM 提出的要求中定義 Authorization 標頭,
  • 您用於訂閱使用者的應用程式金鑰與所用的金鑰不符 簽署 Authorization 標頭。
  • 到期日在 JWT 中無效,即到期時間超過 24 小時, 您的 JWT 已過期。
  • JWT 格式錯誤或含有無效的值。

完整的錯誤回應如下所示:

<html>
  <head>
    <title>UnauthorizedRegistration</title>
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <h1>UnauthorizedRegistration</h1>

    <h2>Error 400</h2>
  </body>
</html>

如果您在 Chrome 中收到此錯誤訊息,建議您使用 Firefox 進行測試 這能讓你更加瞭解問題所在

Firefox 和 Mozilla AutoPush

Firefox 和 Mozilla AutoPush 提供了一組方便使用的錯誤訊息 Authorization 個問題。

您還會收到以下來源的 Unauthorized 錯誤回應: 如果推送中未包含 Authorization 標頭,則使用 Mozilla AutoPush 請求。

{
  "errno": 109,
  "message": "Request did not validate missing authorization header",
  "code": 401,
  "more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
  "error": "Unauthorized"
}

如果 JWT 中的到期日已到期,您也會收到 系統顯示 Unauthorized 錯誤訊息,說明權杖已 已過期。

{
  "code": 401,
  "errno": 109,
  "error": "Unauthorized",
  "more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
  "message": "Request did not validate Invalid bearer token: Auth expired"
}

若應用程式伺服器金鑰與使用者 訂閱,且 Authorization 標頭經過簽署時,Not Found

{
  "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"
}

最後,如果您的 JWT 含有無效值 (例如「alg」值 是未預期的值,您會在 Mozilla 收到以下錯誤: 自動推送:

{
  "code": 401,
  "errno": 109,
  "error": "Unauthorized",
  "more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
  "message": "Request did not validate Invalid Authorization Header"
}

HTTP 狀態碼

基於各種問題, 傳遞服務下方是 HTTP 狀態碼清單,以及它們代表的意義 。

狀態碼 說明
429 傳送的要求過多,您的應用程式伺服器已達頻率限制, 傳遞服務服務的回應應包含「重試後」標頭至 指明要多久才能再次提出要求。
400 要求無效,其中一個標題無效或 格式有誤。
404 找不到。在此情況下,您應該從自己的 並等待對該名使用者重新訂閱。
410 已不存在。訂閱項目已失效,應從 後端。只要在 `PushSubscription`.
413 酬載過大。推送服務必須具有的酬載大小下限 則支援為 4096 個位元組 (或 4 KB)。任何數值過大都可能會造成這項錯誤。

如果 HTTP 狀態碼不在此清單中,且錯誤訊息 有幫助,請檢查網頁推送通訊協定 規格,確認 參考狀態碼,以及 。

酬載加密問題

如果您可以順利觸發推送訊息 (例如傳送訊息到網頁) 並接收 201 回應代碼),但推送事件從未在 通常表示瀏覽器無法執行 解密收到的訊息。

如果是這種情況,Firefox 的開發人員工具中會顯示錯誤訊息 如下所示:

顯示解密訊息的 Firefox 開發人員工具。

如要檢查這是否為 Chrome 問題,請按照下列步驟操作:

  1. 前往 about://gcm-internals 並點選「開始錄影」按鈕。

Chrome GCM 內部記錄。

  1. 觸發推送訊息,並查看「Message Decryption Failure Log」下方的資訊。

GCM 內部解密記錄。

如果酬載的解密發生問題,系統會顯示錯誤訊息 類似於上方所示(請注意 AES-GCM decryption failed 訊息)。

如果這個問題發生,以下工具可協助對加密作業進行偵錯:

連線問題

如果您在 Service Worker 未收到推送事件,而且沒有 如果出現任何解密錯誤,表示瀏覽器可能無法連線至 推送服務

使用 Chrome 時,你可以檢查瀏覽器是否收到訊息 「接收訊息記錄」about://gcm-internals中的 (sic)。

GCM 內部接收訊息記錄。

如果您沒有在時看到訊息,請確認 您的瀏覽器連線狀態是 CONNECTED

GCM 內部連線狀態。

如果不是「已連結」,你可能需要刪除現有個人資料, 建立新的帳戶。如果這樣 仍無法解決問題,請按照下方建議提交錯誤報告。

提出錯誤報告

如果上述事項均無法解決問題,且 請針對您使用的瀏覽器回報一個問題 問題:

如果是 Chrome,請透過下列管道回報問題: https://bugs.chromium.org/p/chromium/issues/list 如果是 Firefox,您應該向以下網站回報問題: https://bugzilla.mozilla.org/

為了提供優質的錯誤報告,請提供下列詳細資料:

  • 您曾測試過的瀏覽器 (例如 Chrome 版本 50、Chrome 版本 51、Firefox 第 50 版,Firefox 51 版)。
  • 說明問題的 PushSubscription 範例。
  • 加入所有範例要求 (例如要推送的網路要求內容) 服務,包括標頭)。
  • 請一併附上來自網路要求的所有範例回應。

如果您能提供可重現的例子,例如原始碼或代管網站 通常可以加快診斷和解決問題的速度。

後續步驟

程式碼研究室