Edge Web 推送通知 - 400 错误,无消息

问题描述 投票:0回答:1

我在向 Edge 发送 Web 推送通知时遇到问题。它在 Chrome、Firefox、Safari 中运行良好,但不适用于 Edge。

我可以在浏览器中获取

endpoint
auth
p256dh
并将它们保存到我的数据库中。当我尝试在 python 中使用它们和
pywebpush
库时,我总是收到 HTTP 状态 400 的错误,并且没有正文消息。这使得很难理解问题所在。

我在 Edge 中得到的端点始终是

https://wns2-db5p.notify.windows.com/w
。我不确定这是否正确,因为我在某处读到基于 Chromium 的浏览器都应该返回
https://fcm.googleapis.com/fcm
。有谁知道这是真的吗?

我注意到 Edge 的通知权限对于用户来说有点不同。我不太确定这是否与订阅返回的变量的有效性有关。当我请求许可时,没有弹出窗口,只有浏览器搜索栏末尾(右侧)的一个图标。单击它时,您会看到弹出窗口。

Edge permission popup after clicking the bell icon

按下允许后,通知似乎已启用并且应该可以工作,因为我得到了我需要的一切。但他们没有。

Edge permissions after allowing notifications

我想也许事情在本地主机上不起作用,所以我部署了我的应用程序,但它没有帮助。

这就是我得到

endpoint
auth
p256dh
的方式:

const subscription = await registration.pushManager.subscribe({
  userVisibleOnly: true,
  applicationServerKey: urlBase64ToUint8Array('<my-public-vapid-key>'),
});
const subscriptionAsJson = subscription.toJSON();
const p256dh = subscriptionAsJson.keys?.p256dh;
const auth = subscriptionAsJson.keys?.auth;
const endpoint = subscriptionAsJson.endpoint;

function urlBase64ToUint8Array(base64String: string) {
  var padding = '='.repeat((4 - base64String.length % 4) % 4);
  var base64 = (base64String + padding)
      .replace(/\-/g, '+')
      .replace(/_/g, '/');
  
  var rawData = window.atob(base64);
  var outputArray = new Uint8Array(rawData.length);
  
  for (var i = 0; i < rawData.length; ++i) {
    outputArray[i] = rawData.charCodeAt(i);
  }
  return outputArray;
}

这也是我用 Python 发送通知的代码:

vapid_claims = settings.VAPID_CLAIMS
parsed_endpoint = urlparse(device.notification_endpoint)
webpush(
    subscription_info={
        "endpoint": device.notification_endpoint,
        "keys": {
            "p256dh": device.p256dh,
            "auth": device.auth,
        }
    },
    data=data,
    vapid_private_key=settings.VAPID_PRIVATE_KEY,
    vapid_claims={
        "sub": vapid_claims["sub"],
        "exp": vapid_claims["exp"],
        "aud": f"{parsed_endpoint.scheme}://{parsed_endpoint.netloc}",
    },
)

我正在使用 Django,这就是我在

setting.py
中的相关代码的样子:

VAPID_PUBLIC_KEY = os.getenv("VAPID_PUBLIC_KEY")
VAPID_PRIVATE_KEY = os.getenv("VAPID_PRIVATE_KEY")
VAPID_CLAIMS = {
    "sub": "mailto:<my-email>",
    "exp": 60,
}

我还尝试在不设置声明的情况下发送通知,因为它适用于其他浏览器,但在这种情况下我收到 401 错误。

microsoft-edge web-push
1个回答
0
投票

您可能没有设置

ttl
,这是必需的。根据 this thread,400 错误是由于未设置
ttl
引起的,并且它似乎只影响 Microsoft Edge。

© www.soinside.com 2019 - 2024. All rights reserved.