Signatur
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
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;
};
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();
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
404oder410 Gone, sollte der Server das Abonnement löschen. Gleiche das Abonnement zusätzlich bei jedem Seitenaufruf mitgetSubscription()ab. - Datenschutz: Der Endpunkt identifiziert ein Gerät eindeutig. Nicht in Logs, URLs oder im
localStorageoffenlegen, 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
p256dhundauth, am einfachsten übersubscription.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
pushsubscriptionchangewird nicht von allen Browsern ausgelöst.