こんにちは @featheredtoast さん、これについても私も興味があります。デスクトップのウェブプッシュ通知は、GCM、FCM、APNs といったサードパーティのブローカーを一切利用せず、通知メッセージは Redis などに接続された独自のエンドポイントから直接送信され、モバイルプッシュ通知のみがそのようなサードパーティのブローカーを利用する、という意味でしょうか?
結論から言うと、プッシュ通知はブラウザ自体の機能によって提供されるため、第三者の仲介業者は関与しません。
技術的には、メッセージをあなたのデバイスに配信する責任を負うサーバー(どこかに存在し、Discourse サーバーとは異なります)があります。当社の実装は、VAPID を実装しているすべてのブラウザでサポートされています(https://blog.mozilla.org/services/2016/08/23/sending-vapid-identified-webpush-notifications-via-mozillas-push-service/)。ブラウザベンダーの 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.
(認証ヘッダーのキーが、このユーザーの購読に使用された送信者 ID と一致しません。Firebase コンソールから正しい送信者 ID とサーバー キーを使用していることを確認してください。)
バックトレース
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'
これらエラーが数千件発生しています。これは…正常な現象でしょうか?
バグのようです。送信者IDが不一致の場合、そのクライアントは自動的に購読解除されるはずですが、FCMからのエラーメッセージを検出する部分にどこかバグがあるようです。
これはユーザーに直接影響するものではありませんが、確かにここには不要なノイズが含まれています。
Webpush::InvalidSubscription と Webpush::Unauthorized 例外は、購読解除によって処理すべきだと考えられます。これらの例外は、プッシュ通知の エラーハンドリング を最後に更新した時点では存在していなかったようです。
先ほどお伝えした通り、このエラーは数千件単位で発生しています:
以前、トピックを統一するために、この件はこちらで報告済みです。必要に応じて、このトピックをマージ、削除、またはその他の対応を行ってください。
