Start · Sprachen · JavaScript · Referenz · PushSubscription.endpoint

PushSubscription.endpoint

Eigenschaft

Schreibgeschützte Eigenschaft, die die URL des Push-Dienstes als String liefert, an die der Anwendungsserver Push-Nachrichten für dieses Abonnement sendet.

seit JavaScript Baseline: seit 2023 in allen gängigen Browsern (Sa Kategorie: webapi

Signatur

PushSubscription.endpoint

Beschreibung

Die schreibgeschützte Eigenschaft endpoint eines PushSubscription-Objekts enthält eine eindeutige, absolute URL des Push-Dienstes des Browserherstellers (z. B. Firebase Cloud Messaging bei Chrome, Mozilla Autopush bei Firefox, Apple Push bei Safari). An diese URL schickt dein Anwendungsserver später per HTTP-POST die verschlüsselten Push-Nachrichten.

In der Praxis liest man endpoint direkt nach PushManager.subscribe() oder PushManager.getSubscription() aus und überträgt ihn zusammen mit den Schlüsseln (p256dh und auth, abrufbar über getKey() oder toJSON()) an den eigenen Server. Dort dient der Endpunkt meist auch als eindeutiger Schlüssel, um Abonnements zu speichern, zu aktualisieren oder zu löschen.

Der Endpunkt ist vertraulich zu behandeln: Wer die URL kennt, kann dem Nutzer zwar keine lesbaren Nachrichten schicken (Payloads müssen verschlüsselt und bei VAPID signiert sein), aber sie identifiziert das Gerät eindeutig. Speichere ihn daher nur serverseitig und übertrage ihn ausschließlich über HTTPS.

Rückgabewert

Typ
string
Beschreibung
Absolute URL (USVString) des Push-Dienst-Endpunkts, z. B. https://fcm.googleapis.com/fcm/send/…. Der Wert ist schreibgeschützt.

Beispiele

Endpunkt nach dem Abonnieren auslesen

// Voraussetzung: registrierter Service Worker, HTTPS, Nutzerzustimmung
const subscribeUser = async (vapidPublicKey) => {
  const registration = await navigator.serviceWorker.ready;
  const subscription = await registration.pushManager.subscribe({
    userVisibleOnly: true,
    applicationServerKey: vapidPublicKey
  });
  console.log('Endpunkt:', subscription.endpoint);
  return subscription;
};
Endpunkt: https://fcm.googleapis.com/fcm/send/dQw4w9WgXcQ:APA91b...

Bestehendes Abonnement an den Server senden

const syncSubscription = async () => {
  const registration = await navigator.serviceWorker.ready;
  const subscription = await registration.pushManager.getSubscription();
  if (!subscription) {
    console.log('Kein aktives Abonnement vorhanden.');
    return;
  }
  // toJSON() enthält endpoint, expirationTime und keys
  await fetch('/api/push/subscriptions', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(subscription.toJSON())
  });
  console.log('Gespeichert:', new URL(subscription.endpoint).host);
};

syncSubscription();
Gespeichert: fcm.googleapis.com

Abonnement kündigen und serverseitig anhand des Endpunkts löschen

const unsubscribeUser = async () => {
  const registration = await navigator.serviceWorker.ready;
  const subscription = await registration.pushManager.getSubscription();
  if (!subscription) return false;

  const { endpoint } = subscription;
  const ok = await subscription.unsubscribe();
  if (ok) {
    await fetch('/api/push/subscriptions', {
      method: 'DELETE',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ endpoint })
    });
  }
  return ok;
};

Endpunktwechsel im Service Worker behandeln

// sw.js – Event wird nur in manchen Browsern (v. a. Firefox) ausgelöst
self.addEventListener('pushsubscriptionchange', (event) => {
  event.waitUntil((async () => {
    const newSub = await self.registration.pushManager.subscribe(
      event.oldSubscription.options
    );
    await fetch('/api/push/subscriptions/replace', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        oldEndpoint: event.oldSubscription?.endpoint,
        subscription: newSub.toJSON()
      })
    });
  })());
});

// Wichtig · Fallstricke

  • Nicht dauerhaft stabil: Der Endpunkt kann sich ändern oder ungültig werden (Abonnement abgelaufen, Nutzer hat Berechtigung entzogen, Browserdaten gelöscht). Antwortet der Push-Dienst mit HTTP 404 oder 410 Gone, sollte der Server das Abonnement löschen. Gleiche das Abonnement zusätzlich bei jedem Seitenaufruf mit getSubscription() ab.
  • Datenschutz: Der Endpunkt identifiziert ein Gerät eindeutig. Nicht in Logs, URLs oder im localStorage offenlegen, nur per HTTPS übertragen.
  • Format nicht auswerten: Aufbau und Host hängen vom Browserhersteller ab. Behandle den Wert als undurchsichtige URL, parse keine IDs daraus und verlasse dich nicht auf eine bestimmte Domain.
  • Allein nicht ausreichend: Zum Senden verschlüsselter Nachrichten braucht der Server außerdem die Schlüssel p256dh und auth, am einfachsten über subscription.toJSON().
  • Kompatibilität: Nur in sicheren Kontexten (HTTPS) und mit aktivem Service Worker verfügbar. Safari unterstützt Web Push ab Version 16 (macOS 13+), unter iOS/iPadOS erst ab 16.4 und nur für Web-Apps, die zum Home-Bildschirm hinzugefügt wurden. Das Event pushsubscriptionchange wird nicht von allen Browsern ausgelöst.