常见问题和报告错误

Matt Gaunt

当您遇到 Web 推送问题时,可能很难调试问题或 寻求帮助。本文档概述了一些常见问题,以及您应该采取的 如果您在 Chrome 或 Firefox 中发现了错误,可以采取以下措施。

在我们深入了解如何调试推送之前,您可能会遇到调试方面的问题 Service Worker 本身,则文件未更新、无法注册或 通常只是异常行为。这里有 关于调试 Service Worker 的精彩文档 我强烈建议您参阅 Service Worker 开发。

在开发和测试 Web 推送时,需要对两个不同的阶段进行核对, 每种方法都有自己的一系列常见问题:

  • 发送消息:确保消息发送成功。 您应该会收到 201 HTTP 代码。如果您不是: <ph type="x-smartling-placeholder">
  • 接收消息:如果您能够成功发送消息, 但浏览器未收到消息: <ph type="x-smartling-placeholder">

如果您无法收发推送消息和相关部分 对问题的调试没有帮助,那么您可能会发现 推送机制本身存在的 bug在这种情况下,请参阅 提高 bug 报告 部分,提交一份完善的错误报告,其中包含所有必要的信息,以便我们加快处理速度 问题修复流程

在开始之前,我要说的一点是,Firefox 和 Mozilla AutoPush Service 会显示大量错误消息。如果您遇到困难 不确定问题出在哪里,请在 Firefox 中进行测试,看看能否 您可以获得更实用的错误消息

授权问题

授权问题是开发者遇到的最常见问题之一 我们先来了解 Web 推送这通常是 网站的应用服务器密钥(也称为 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 错误响应: Mozilla AutoPush(如果推送中不包含 Authorization 标头) 请求。

{
  "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 状态代码及其相关含义 Web 推送。

状态代码 说明
429 请求数量过多。您的应用服务器已达到速率限制, 推送服务服务的响应应包含“重试-之后”标头设为 指明在多长时间后可以发出其他请求
400 请求无效。您的某个标头无效或 格式不当。
404 未找到。在这种情况下,您应该将 PushSubscription 从 并等待用户重新订阅的机会。
410 走了。订阅已失效,应从您的 。可以通过在 `PushSubscription`.
413 有效负载过大。推送服务必须达到的最小载荷大小 支持 4096 个字节(或 4kb)。任何更大的文件都可能会导致此错误。

如果 HTTP 状态代码不在此列表中,且错误消息 请参阅网络推送协议 规范来确认 引用了状态代码,并说明了该状态代码何时可以 。

载荷加密问题

如果您可以成功触发推送消息(例如,将消息发送到 Web、 推送服务并接收 201 响应代码),但推送事件永远不会 这通常表示浏览器无法 解密收到的消息。

如果是这种情况,您会在 Firefox 的开发者工具中看到一条错误消息。 控制台如下所示:

Firefox 开发者工具显示解密消息。

要检查是否是 Chrome 中的问题,请执行以下操作:

  1. 前往 about://gcm-internals,然后点击“Start Recording”(开始录制)按钮。

Chrome GCM 内部记录。

  1. 触发推送消息,并查看“消息解密失败日志”。

GCM 内部解密日志。

如果载荷解密出现问题,系统会显示错误消息 与上面显示的示例类似(请注意 AES-GCM decryption failed 消息)。

如果遇到此问题,以下一些工具可能有助于调试加密问题:

连接问题

如果您没有在 Service Worker 中收到推送事件,也没有 则浏览器可能无法连接到 推送服务

在 Chrome 浏览器中,您可以通过检查浏览器是否正在接收消息, “接收消息日志”(sic)about://gcm-internals

GCM 内部用于接收消息日志。

如果您看到的邮件没有及时送达,请确保 您的浏览器的连接状态为 CONNECTED

GCM 内部连接状态。

如果不是“已连接”,您可能需要删除当前的个人资料,并且 创建一个新网域。如果 仍然无法解决问题,请按照下面的建议提交错误报告。

提交 bug 报告

如果上述方法均无法解决您的问题,并且没有迹象表明 请向我们报告您使用的浏览器的问题 问题:

对于 Chrome,您应在此处提交问题: https://bugs.chromium.org/p/chromium/issues/list 对于 Firefox,您应在以下位置提出此问题: https://bugzilla.mozilla.org/

如需提供优质的 bug 报告,您应提供以下详细信息:

  • 进行过测试的浏览器(例如 Chrome 50、Chrome 51、Firefox) 版本 50、Firefox 51)。
  • 演示问题的 PushSubscription 示例。
  • 包含任何示例请求(即发送到推送的网络请求内容) 包括标头)。
  • 同时包括网络请求的所有示例响应。

如果您可以提供可重现的示例(源代码或托管网络示例) 通常可以加快诊断和解决问题的速度。

下一步做什么

Codelab