【问题标题】:Web Notification push throws 400 from python on ChromeWeb 通知推送从 Chrome 上的 python 抛出 400
【发布时间】:2018-10-04 08:41:38
【问题描述】:

我正在使用 pywebpush 1.4.0 库从 Django 后端推送 Web 通知。我使用的密钥是从https://web-push-codelab.glitch.me/ 获得的。订阅似乎工作正常。此外,我在 Firefox 上对此进行了测试,它在那里运行良好。

我在推送 Chrome 时收到以下错误服务器端:

Push failed: <Response [400]>: <HTML>
<HEAD>
<TITLE>UnauthorizedRegistration</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>UnauthorizedRegistration</H1>
<H2>Error 400</H2>
</BODY>
</HTML>

奇怪的是,我的后端控制着 3 个域,并且即使在一个域上的 Chrome 上,推送也可以正常工作,而在其他域上则无法正常工作。我排除了以下可能的问题:

我看到的唯一可能性是 Chrome 是否不允许来自同一后端的不同域的推送通知。有没有人知道这样的限制或可以在这里帮助我提供任何其他指针?

注意:我对所有三个域使用不同的密钥。

这是我用来推送的代码:

from pywebpush import webpush
webpush(subscription_info,
                data,
                vapid_private_key=vapid_private_key,
                vapid_claims={"sub": "mailto:xyz@example.com"})

subscription_info是订阅用户时收到的json,vapid_private_key是对应的私钥。

【问题讨论】:

  • Django 频道可以实现这个功能。
  • 问题未在实施中。正如我所说,它在 Firefox 和 Chrome 上的一个域上运行良好。问题在于在 Chrome 上处理多个域时。

标签: python google-chrome firefox web-notifications


【解决方案1】:

FAQ 列出了您的错误(引用)的以下原因:

  • 如果您未能在对 FCM 的请求中定义授权标头。
  • 您用于订阅用户的应用程序密钥与用于签署授权标头的密钥不匹配。
  • 在您的 JWT 中过期无效,即过期超过 24 小时或 JWT 已过期。
  • JWT 格式错误或包含无效值

它还规定了在请求中添加applicationServerKey 的要求,并且这在 Firefox 中不是强制性的。您的问题可能出在此处:您确定 vapid_private_key 变量指的是每个域的正确私钥吗?可能它实际上始终是您工作域的关键。

如果我们有更多您使用的代码,可能会更容易找到一些潜在的错误。 Chrome 只需要每个服务器一个密钥,但应该能够处理多个不同的服务器订阅。

【讨论】:

    猜你喜欢
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 2020-07-31
    • 2017-10-15
    • 2016-12-08
    相关资源
    最近更新 更多