プッシュメッセージの送信

プッシュメッセージの送信

仕様書

アプリケーションサーバーからプッシュサービスへ

[14] アプリケーションサーバーは、 プッシュメッセージプッシュ資源に送信し、 配送を要求します。 >>2 5. アプリケーションサーバーは事前にプッシュ購読プッシュエンドポイント (プッシュ資源URL) や、その他必要な情報を知っておく必要があります。 プッシュ購読

[15] アプリケーションサーバーは、 プッシュ購読プッシュ購読データTTL秒数 TTLUrgency: の値または null urgency Urgency: Topic: の値または null topic Topic: 配送確認の希望の有無配送確認について、 次のようにします。

  1. [12] Assert: データは、 長さ [0, 3993] のバイト列です。 プッシュメッセージ
  2. [1] 要求を、新しい要求に設定します。
    [28] 要求
    メソッド
    POST >>2 5.
    URL
    プッシュ購読プッシュエンドポイント >>2 5.
    ヘッダーリスト
    [6] ヘッダーリスト
    TTL
    TTL非負整数として直列化した結果 TTL:
  3. [4] 配送確認の場合、
    1. [20] 要求に、 HTTPヘッダー Prefer: respond-async を追加します。 >>2 5.1.
    2. [5] 要求について、 既存の受領証購読資源を設定します。 (>>23)
  4. [8] urgencynullない場合、
    1. [9] 要求に、 HTTPヘッダー Urgency: urgency を追加します。
  5. [10] topicnullない場合、
    1. [11] 要求に、 HTTPヘッダー Topic: topic を追加します。
  6. [64] プッシュ購読特定アプリケーションサーバーに制限されているの場合 >>63
    1. [31] credentials を、 プッシュ購読について VAPID credentials を作成した結果に設定します。 VAPID
    2. [32] 要求HTTPヘッダー Authorization: vapid credentials を追加します。
  7. [13] データnullない場合、
    1. [16] 送信データを、 データプッシュ購読について aes128gcm符号化した結果に設定します。
    2. [30] 要求HTTPヘッダー Content-Encoding: aes128gcm を追加します。
    3. [7] 要求本体を、 送信データに設定します。 >>2 5.
  8. [3] 要求を送信します。 >>2 5.

[23] 以前に要求URL起源同じ起源配送確認要求して受領証購読資源URL を受け取っていた場合、 要求受領証購読資源URLurn:ietf:params:push:receipt として関係URLを設定するべきです>>2 5.1.

[25] ただし、 当該受領証購読の寿命の間、 受領証を集約して受信することができないなら、 受領証購読を省略して構いませんアプリケーションサーバーが他のプッシュメッセージ送信者のかわりに受領証購読を監視するような場合に、 その必要があるかもしれません。 >>2 5.1.


[54] プッシュサービスは、 プッシュメッセージ購読満期の場合、 404 応答を返さなければなりません >>2 7.3.

[60] プッシュサービスは、任意の方法で認証できます。 >>2 8.3.

[61] プッシュサービスは、 DoS攻撃対策として、 プッシュメッセージを特定利用者エージェントに配送する速度を制限するべきです。 制限を超えた時プッシュサービス429 応答を返すことができますRetry-After: ヘッダーに待機時間を指定するべきです。 過大なプッシュメッセージを受け取ったプッシュメッセージ購読を終端させても構いません。 >>2 8.4.

[62] プッシュメッセージ購読が特定アプリケーションサーバーに制限されている場合 (プッシュサービス資源を使って作成したときに公開鍵が指定された場合)、 要求について VAPID の処理をしなければなりません。 VAPID

[72] プッシュサービスは、 VAPIDJWT公開鍵利用者エージェント転送してはなりません>>63

[51] プッシュサービスは、 実体本体が大きすぎる場合、 413 応答を返して構いません4096 バイト以下なら、 413 を返してはなりません>>2 7.2.

[52] 実装によって上限が異なると、相互運用性の問題を生じる危険性があります。 プッシュサービスは、 4096 バイトを超えたら 413 応答を返すのが非常に好ましいでしょう。

[29] TTL: ヘッダーUrgency: ヘッダーTopic: ヘッダーを処理しなければなりません。 Topic: ヘッダーの指定に基づき、 既存のプッシュメッセージが削除されることもあります。

[19] プッシュサービスは、 プッシュメッセージを受け取ったらプッシュメッセージ資源を作成します。

[19] プッシュメッセージ資源URL は、 プライバシーのため、 プッシュメッセージ購読間の関係性を含むものであってはなりません。 関連付けられたプッシュメッセージ購読との関係や、 同じプッシュメッセージ購読の他のプッシュメッセージとの関係を示すものであるのは構いません利用者装置の情報を含めてはなりません。 同じプッシュメッセージ購読に関連付けられたプッシュメッセージ資源URL から利用者エージェントとの関係を知れるものであってはなりません>>2 8.2.

[24] 配送確認 (Prefer: respond-async) が求められた場合、 受領証購読資源を必要なら作成します。 要求で指定されている場合は、 可能ならそれを再利用するべきですが、 無理なら新しいものを作っても構いません >>2 5.1.。 実装依存の制約 (有効期限など) で再利用できないこともありましょう。

[26] 要求で指定された受領証購読が非妥当なら、 400 応答を返さなければなりません>>2 5.1. 異なるアプリケーションサーバー用の受領証購読資源が指定されるのは不適当でしょうし、 受領証購読資源でないものが指定された場合もそうでしょう。

[27] 受領証購読数を制限したい場合、 受領証購読の指定のない要求を、 429 応答で拒絶して構いません>>2 5.1.

[50] 配送のため蓄積するプッシュメッセージには、 アプリケーションサーバーが配送を求めた時刻を表す Last-Modified: ヘッダーを含めるべきです>>2 7.2. これは要求を受理した時点での現在時刻を保存し、 TTL: の計算に供するべきとの趣旨と思われます。 後にプッシュメッセージを配送するときにこの時刻を利用者エージェントに送付するべきなのかどうかは、 何とも書かれていません。 (利用者エージェントは特にこれを使わないので、送付するべきではないとみられます。) アプリケーションサーバーが既に指定していた場合にどうするかも規定されていませんが、 TTL: の計算に用いる趣旨ならば、これは無視する (削除する) べきでしょう。


[17] プッシュメッセージを受理した場合、 201 応答を返します。 まだこれは利用者エージェントプッシュメッセージが配送されたことを意味しません>>2 5.

[21] プッシュメッセージを受理した場合で、 配送確認 (Prefer: respond-async) が求められた場合、 202 応答を返さなければなりません >>2 5.1.

[18] Location: ヘッダーに、 作成したプッシュメッセージ資源URL を記述しなければなりません>>2 5., 5.1.

[22] 配送確認が求められた場合、 リンク関係型 urn:ietf:params:push:receipt受領証購読資源URL を記述しなければなりません。 >>2 5.1. Link: ヘッダーを使えます。

プッシュサービスから

プッシュメッセージの受信

実装

[17] Firefoxhttps://updates.push.services.mozilla.com/push/v1/... のようなエンドポイントURL を使っています。 メッセージを渡さないなら、何でも良いので POST だけすればOKです。 各エンドポイントURLにそれぞれ POST する必要があります。

[45] FirefoxapplicationServerKey なしで subscribe できます。 https://updates.push.services.mozilla.com/wpush/v1/... のような URL を使っています。 ただの POST では受け付けてくれません。 TTL: ヘッダーがあれば他はなにもない POST でも受け付けてくれます。

[51] ChromeapplicationServerKey なしで subscribe できず、 拒絶されます。 ありだと https://fcm.googleapis.com/fcm/send/... のような URL を返してきます。 ただの POST では受け付けてくれません。 Authorization: ヘッダーがないと 400 UnauthorizedRegistration を返します。 Authorization: ヘッダーが構文エラーだと 500 Internal Server Error を返します。 Authorization: ヘッダーの内容がおかしいと 400 InvalidParameters を返します。 Authorization: ヘッダーk= が違う鍵だと 403 MismatchSenderId を返します。 暗号化された本体データが壊れていても、 201 Created を返して成功に見えますが、 Webブラウザーには (あるいはサービスワーカーには?) 伝わりません。 本体がまったく含まれておらず Content-Encoding: もなければ正常に処理されます。 TTL: がないと 400 InvalidTtlParameter を返します。 sub は省略可能です。 unsubscribe 済みだと 410 NotRegistered を返します。

[15] ChromeGCM を使っているので、その Web API で push を送信できます。 受信したエンドポイントURLが https://android.googleapis.com/gcm/send/ から始まるなら、その続きの部分を ID として、 https://android.googleapis.com/gcm/sendJSONPOST します。 (詳しくは GCM のドキュメント参照。) 複数のクライアントのIDをまとめて送信できます。

[14] つまり、エンドポイントURLGCM のものだけ特別に扱い、 それ以外の https: URL について個別に POST すればよいということになります。

メモ