我正在使用pywebpush 1.4.0库来从Django Backend推出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个域,并且推动在一个域上也可以正常工作,而不是在另一个域上工作。我排除了以下可能的问题:
- 私人和公共密钥对不当,因为它在Firefox上工作正常
- 与chrome上的一个域一样,过时的pywebpush库,它正常工作
- 几乎没有答案(Chrome Web通知推送未经授权的注册例外(指出了更新Pywebpush安装的PY-VAPID版本,但它的版本已经是Py-vapid == 1.3.0
我看到的唯一可能性是,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是相应的私钥。
常见问题解答列出了您错误的以下原因(QUOTE(:
- 如果您未能在对FCM请求中定义授权标题。
- 您的应用程序密钥用于订阅用户不匹配用于签署授权标头的密钥。
- 在您的JWT中,到期无效,即到期超过24小时或JWT已过期。
- JWT已畸形或具有无效的值
它还指出了向请求中添加applicationServerKey
的要求,并且在Firefox中不规定。您的问题可能在这里:您确定vapid_private_key
变量是指每个域的正确私钥吗?实际上,这可能是您工作域的关键。
如果我们使用了更多您使用的代码,则可能会更容易找到一些潜在的错误。Chrome只需要每个服务器一个密钥,但应该能够处理多个不同的服务器订阅。