gpt4 book ai didi

ruby-on-rails - 使用 VAPID : 400/401 Unauthorized Registration 进行网络推送

转载 作者:数据小太阳 更新时间:2023-10-29 07:35:29 35 4
gpt4 key购买 nike

首先,我已经检查了这些问题,没有任何运气:

我正在尝试为我正在开发的网络应用程序实现网络推送通知。目前,我已经实现了以下目标:

  • 创建 VAPID key 对 ( with this guide )。
  • 注册一个service worker(只是一个service worker,我觉得manifest.json已经不需要了)。
  • 将用户订阅到服务器(订阅数据将存储在数据库中)。
  • 使用 webpush 发送推送通知 gem 。

设置后,一切正常(在本地主机和远程机器上)。然而,几个小时后(12 到 24 小时之间),远程机器上的通知停止工作(本地主机工作正常)。在那之后,从服务器端 (Rails) 发送推送通知时会抛出以下错误:

  • Chrome: UnauthorizedRegistration 400(无额外信息)。
  • Firefox: {"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 > 24 hours in the future"

出现此错误后,我尝试在每次访问页面时取消订阅并重新订阅用户。重新订阅完成后,数据库上的订阅字段会更新,但仍然会抛出错误,信息相同。浏览器和 Service Worker 都不会抛出任何错误。

我尝试通过在 Chrome Dev Tools 控制台上放置一些 js 代码、注销服务 worker 并重置推送通知权限来手动强制重新订阅,但没有解决错误。我只能通过创建新的 VAPID key 对 重新启动远程计算机 来修复此错误。重启机器后,我还有 12-24 小时才能再次失败。此外,通知发送过程在 rails 服务器 (nginx + unicorn)rails consoleirb 上都不起作用。

我不知道从哪里开始。更糟糕的是,我每天只能尝试修复一次,因为它每 24 小时就会出现故障。我想我需要一些外部帮助来重新审视这个问题。我错过了什么吗? VAPID 是否使用任何操作系统依赖项并且需要重新启动?


以下是一些可能有用的代码片段。很抱歉弄得一团糟,但我已经做了很多修改来尝试让它发挥作用。

Service Worker 注册:

serviceWorkerRegistration = null

registerServiceWorker = ->
if 'serviceWorker' of navigator && 'PushManager' of window
navigator.serviceWorker.register("<js url>").then (reg) ->
serviceWorkerRegistration = reg
checkSubscription()

.catch (error) ->
console.warn 'Service Worker Error', error

else
console.warn 'Push messaging is not supported'

registerServiceWorker()

用户订阅和重新订阅

# Refresh user subscription (unsub + sub)
refreshUserSubscription = ->
unsubscribeUser(subscribeUser)

# Subscribe the user to the push server
subscribeUser = ->
return if !serviceWorkerRegistration

# Subscribe
serviceWorkerRegistration.pushManager.subscribe
userVisibleOnly: true
applicationServerKey: urlB64ToUint8Array('...')

.then (subscription) ->
pushSubscription subscription

.catch (err) ->
console.warn 'Failed to subscribe the user: ', err

# Unsubscribe user
unsubscribeUser = (callback)->
return unless serviceWorkerRegistration

serviceWorkerRegistration.pushManager.getSubscription().then (subscription) ->
if subscription
subscription.unsubscribe().then(callback)
else
callback()
.catch (error) ->
console.warn 'Error unsubscribing', error

# Push subscription to the web app
pushSubscription = (subscription) ->
data = if subscription then subscription.toJSON() else {}
$.post "<back-end endpoint>", subscription: data

# Fetch current subscription, and push it.
checkSubscription = () ->
serviceWorkerRegistration.pushManager.getSubscription()
.then (subscription) ->
pushSubscription(subscription)

# I think that this should be done with promises instead of a simple timeout.
setTimeout refreshUserSubscription, 1000

服务 worker :

self.addEventListener 'push', (event) ->
title = "Example"
options = { body: "Example" }

notificationPromise = self.registration.showNotification(title, options)
event.waitUntil(notificationPromise)

网络推送调用:

webpush = WebPush.new({ endpoint: '...', keys: { p256dh: '...', auth: '...' } })
webpush.set_vapid_details(
"mailto:#{CONTACT_EMAIL}",
"<base64 public key>",
"<base64 private key>"
)
webpush.send_notification("foo")

最佳答案

将过期时间从 24 小时(默认)更改为 12 小时后,现在可以正常工作了:

Webpush.payload_send(
message: "Hi!",
endpoint: "...",
p256dh: "...",
auth: "...",
vapid: {
subject: "...",
public_key: ENV['VAPID_PUBLIC_KEY'],
private_key: ENV['VAPID_PRIVATE_KEY'],
exp: 12.hours
}
)

关于ruby-on-rails - 使用 VAPID : 400/401 Unauthorized Registration 进行网络推送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43632403/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com