Используют ли push-уведомления сторонних брокеров?

Привет @featheredtoast, мне тоже интересно. Вы имеете в виду, что веб-уведомления для десктопа не используют стороннего брокера, такого как GCM, FCM или APNs, и что сообщения об уведомлениях поступают напрямую с вашего собственного эндпоинта — подключенного, например, к Redis, — в то время как сторонние брокеры используются только для мобильных push-уведомлений?

Короткий ответ: нет. Уведомления предоставляются благодаря встроенным в браузер интеграциям, поэтому сторонний посредник не участвует.

Технически существует сервер (где-то, но не ваш сервер Discourse), отвечающий за доставку сообщений на ваше устройство. Наша реализация поддерживается всеми браузерами, которые реализуют VAPID (Sending VAPID identified WebPush Notifications via Mozilla’s Push Service | Mozilla Services). Именно VAPID-серверы поставщиков браузеров фактически отправляют данные на ваше устройство.

Извините, что снова поднимаю эту тему, но мои поиски привели меня сюда, и я не уверен, связано ли это.

Наши /logs заполнены сообщениями:

Failed to send push notification : host: fcm.googleapis.com, #<Net::HTTPForbidden 403 Forbidden readbody=true> body: the key in the authorization header does not correspond to the sender ID used to subscribe this user. Please ensure you are using the correct sender ID and server Key from the Firebase console.

Backtrace
webpush-1.1.0/lib/webpush/request.rb:175:in `verify_response'

webpush-1.1.0/lib/webpush/request.rb:34:in `perform'

webpush-1.1.0/lib/webpush.rb:44:in `payload_send'

/var/www/discourse/app/services/push_notification_pusher.rb:79:in `send_notification'

/var/www/discourse/app/services/push_notification_pusher.rb:25:in `block in push'

activerecord-6.0.3.3/lib/active_record/relation/delegation.rb:87:in `each'

activerecord-6.0.3.3/lib/active_record/relation/delegation.rb:87:in `each'

/var/www/discourse/app/services/push_notification_pusher.rb:23:in `push'

/var/www/discourse/app/jobs/regular/send_push_notification.rb:7:in `execute'

/var/www/discourse/app/jobs/base.rb:232:in `block (2 levels) in perform'

rails_multisite-2.5.0/lib/rails_multisite/connection_management.rb:76:in `with_connection'

/var/www/discourse/app/jobs/base.rb:221:in `block in perform'

/var/www/discourse/app/jobs/base.rb:217:in `each'

/var/www/discourse/app/jobs/base.rb:217:in `perform'

sidekiq-6.1.2/lib/sidekiq/processor.rb:196:in `execute_job'

sidekiq-6.1.2/lib/sidekiq/processor.rb:164:in `block (2 levels) in process'

sidekiq-6.1.2/lib/sidekiq/middleware/chain.rb:138:in `block in invoke'

/var/www/discourse/lib/sidekiq/pausable.rb:138:in `call'

sidekiq-6.1.2/lib/sidekiq/middleware/chain.rb:140:in `block in invoke'

sidekiq-6.1.2/lib/sidekiq/middleware/chain.rb:143:in `invoke'

sidekiq-6.1.2/lib/sidekiq/processor.rb:163:in `block in process'

sidekiq-6.1.2/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch'

sidekiq-6.1.2/lib/sidekiq/job_retry.rb:111:in `local'

sidekiq-6.1.2/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch'

sidekiq-6.1.2/lib/sidekiq.rb:38:in `block in <module:Sidekiq>'

sidekiq-6.1.2/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch'

sidekiq-6.1.2/lib/sidekiq/processor.rb:257:in `stats'

sidekiq-6.1.2/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch'

sidekiq-6.1.2/lib/sidekiq/job_logger.rb:13:in `call'

sidekiq-6.1.2/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch'

sidekiq-6.1.2/lib/sidekiq/job_retry.rb:78:in `global'

sidekiq-6.1.2/lib/sidekiq/processor.rb:124:in `block in dispatch'

sidekiq-6.1.2/lib/sidekiq/logger.rb:10:in `with'

sidekiq-6.1.2/lib/sidekiq/job_logger.rb:33:in `prepare'

sidekiq-6.1.2/lib/sidekiq/processor.rb:123:in `dispatch'

sidekiq-6.1.2/lib/sidekiq/processor.rb:162:in `process'

sidekiq-6.1.2/lib/sidekiq/processor.rb:78:in `process_one'

sidekiq-6.1.2/lib/sidekiq/processor.rb:68:in `run'

sidekiq-6.1.2/lib/sidekiq/util.rb:15:in `watchdog'

sidekiq-6.1.2/lib/sidekiq/util.rb:24:in `block in safe_thread'

Мы видим тысячи таких сообщений. Это… нормально?

Звучит как баг: несовпадающие идентификаторы отправителя должны автоматически отписывать клиента, но, похоже, где-то есть ошибка при определении сообщения об ошибке от FCM.

Это точно не то, что видит клиент, но да, это лишний шум, которого не должно быть.

Полагаю, мы должны обрабатывать исключения Webpush::InvalidSubscription и Webpush::Unauthorized, отписываясь от них. Похоже, их не было, когда мы в последний раз обновляли обработку ошибок для push-уведомлений.

Как я уже упоминал, мы получаем это тысячами:

Ранее я уже сообщал об этом здесь, на случай если вы захотите оставить эту тему в теме. Можете объединить, удалить или сделать что-то другое.