Signatur
Beschreibung
Die Eigenschaft applicationServerKey eines PushSubscriptionOptions-Objekts gibt den öffentlichen Schlüssel zurück, der beim Aufruf von PushManager.subscribe() übergeben wurde. Der Push-Dienst des Browsers (z. B. FCM, Mozilla Autopush oder Apple Push) prüft mit diesem Schlüssel, ob Push-Nachrichten wirklich von deinem Anwendungsserver stammen. Dieses Verfahren heißt VAPID (Voluntary Application Server Identification, RFC 8292).
Du erreichst das Objekt über PushSubscription.options. Der Wert ist ein ArrayBuffer mit dem rohen, unkomprimierten öffentlichen P-256-Schlüssel (65 Byte, beginnt mit 0x04). Wurde beim Abonnieren kein Schlüssel angegeben, ist der Wert null.
In der Praxis brauchst du die Eigenschaft vor allem, um zu prüfen, ob ein bestehendes Abonnement noch zum aktuellen Server-Schlüssel passt. Das ist wichtig, wenn du die VAPID-Schlüssel rotierst: Stimmt der gespeicherte Schlüssel nicht mehr, musst du das alte Abonnement mit unsubscribe() kündigen und neu abonnieren. Sonst weist der Push-Dienst die Nachrichten ab (meist mit HTTP 403).
Rückgabewert
null, wenn beim Abonnieren keiner übergeben wurde.Beispiele
Schlüssel eines bestehenden Abonnements auslesen
const registration = await navigator.serviceWorker.ready;
const subscription = await registration.pushManager.getSubscription();
if (subscription) {
const key = subscription.options.applicationServerKey;
console.log(key instanceof ArrayBuffer, key?.byteLength);
} else {
console.log('Kein Push-Abonnement vorhanden');
}
Abonnieren mit VAPID-Schlüssel (Base64url → Uint8Array)
const VAPID_PUBLIC_KEY = 'BEl62iUYgUivxIkv69yViEuiBIa-Ib9-SkvMeAtA3LFgDzkrxZJjSgSnfckjBJuBkr3qBUYIHBQFLXYp5Nksh8U';
const base64UrlToUint8Array = (base64Url) => {
const padding = '='.repeat((4 - (base64Url.length % 4)) % 4);
const base64 = (base64Url + padding).replace(/-/g, '+').replace(/_/g, '/');
return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));
};
const registration = await navigator.serviceWorker.ready;
const subscription = await registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: base64UrlToUint8Array(VAPID_PUBLIC_KEY)
});
console.log(subscription.options.applicationServerKey.byteLength);
Nach Schlüsselrotation neu abonnieren
const toBase64Url = (buffer) =>
btoa(String.fromCharCode(...new Uint8Array(buffer)))
.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
const ensureSubscription = async (currentKeyBase64Url, keyBytes) => {
const registration = await navigator.serviceWorker.ready;
let sub = await registration.pushManager.getSubscription();
const storedKey = sub?.options.applicationServerKey;
if (sub && (!storedKey || toBase64Url(storedKey) !== currentKeyBase64Url)) {
console.log('Schlüssel veraltet – neu abonnieren');
await sub.unsubscribe();
sub = null;
}
sub ??= await registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: keyBytes
});
return sub;
};
// Wichtig · Fallstricke
- Typen sind verschieden: An
subscribe()darfst du einen Base64url-String, einenArrayBufferoder einTypedArrayübergeben. Die Eigenschaft liefert aber immer einenArrayBuffer. Für Vergleiche musst du den Wert also erst umwandeln, z. B. nach Base64url oder byteweise überUint8Array. - Schreibgeschützt: Eine Zuweisung hat keine Wirkung. Für einen neuen Schlüssel brauchst du ein neues Abonnement.
- Veröffentliche nur den öffentlichen Schlüssel im Client. Der private VAPID-Schlüssel gehört ausschließlich auf den Server.
- Chrome verlangt beim Abonnieren einen
applicationServerKeyunduserVisibleOnly: true. Ohne diese Angaben schlägtsubscribe()fehl. - Die Push API funktioniert nur in sicheren Kontexten (HTTPS) und nur mit registriertem Service Worker. Safari unterstützt Web Push erst ab 16 (macOS) bzw. 16.4 (iOS), auf iOS nur für Web-Apps, die zum Home-Bildschirm hinzugefügt wurden.