TsgcWebPush_Clientメソッド › SendNotification

SendNotification メソッド

aes128gcm でペイロードを暗号化し、VAPID で署名したリクエストをブラウザーのサブスクリプションエンドポイントに POST します。

構文

procedure SendNotification(const aPushSubscription : TsgcHTTP_API_WebPush_PushSubscription; const aText: string);

パラメータ

名前タイプ説明
aPushSubscriptionconst TsgcHTTP_API_WebPush_PushSubscriptionブラウザが登録時に返すサブスクリプション レコード。Endpoint(POST 先のプッシュ サービス URL)、PublicKey(ユーザー エージェントの P-256 公開鍵、p256dh、Base64URL エンコード)、AuthSecret(16 バイトの auth シークレット、Base64URL エンコード)を持ちます。これらはメッセージごとのコンテンツ暗号化キーの導出に使用されます。
aTextconst stringブラウザーに配信するクリアテキストペイロード(通常、Service Worker が解釈する JSON ドキュメント)。値は UTF-8 エンコードされ、送信前に aes128gcm で暗号化されます。空の文字列を渡すとペイロードなしの通知が送信されます。

解説

単一呼び出しの Web Push 送信(RFC 8030 + RFC 8291)。このメソッドは VAPID キーが設定されていること、aPushSubscription にエンドポイント、PublicKey、AuthSecret が含まれていることを検証し、ユーザーエージェントの公開鍵に対して ECDH 共有シークレットを計算し、HKDF でコンテンツ暗号化キーとノンスを導出し、aes128gcm で aText を暗号化し、PEM 秘密鍵で署名した VAPID JWT(ES256)を構築して Authorization ヘッダーに追加し、DER 公開鍵を Crypto-Key ヘッダーに配置し、バイナリの暗号文をサブスクリプションエンドポイントに POST します。キーが見つからない場合は EsgcWebSocketException が発生します。プッシュサービスは成功時に 201/202、サブスクリプションが期限切れで削除が必要な場合に 404/410、スロットリングが適用される場合に 429 を返します。

使用例

var
  oSubscription: TsgcHTTP_API_WebPush_PushSubscription;
begin
  oSubscription := TsgcHTTP_API_WebPush_PushSubscription.Create;
  try
    oSubscription.Endpoint := 'https://fcm.googleapis.com/fcm/send/...';
    oSubscription.PublicKey := 'BASE64URL_P256DH';
    oSubscription.AuthSecret := 'BASE64URL_AUTH';

    sgcWebPush_Client1.VAPID.PEM.PrivateKey.Text := '-----BEGIN PRIVATE KEY-----...';
    sgcWebPush_Client1.VAPID.DER.PrivateKey := 'BASE64URL_PRIVATE_KEY';
    sgcWebPush_Client1.VAPID.DER.PublicKey := 'BASE64URL_PUBLIC_KEY';
    sgcWebPush_Client1.VAPID.Details.MailTo := 'info@esegece.com';

    sgcWebPush_Client1.SendNotification(oSubscription,
      '{"title":"eSeGeCe","body":"Hello from sgcWebSockets!"}');
  finally
    oSubscription.Free;
  end;
end;

メソッドに戻る