Start · Sprachen · JavaScript · Referenz · PublicKeyCredential.parseCreationOptionsFromJSON()

PublicKeyCredential.parseCreationOptionsFromJSON()

Methode

Wandelt ein JSON-Objekt mit Registrierungsoptionen (Base64URL-Strings) in ein <code>PublicKeyCredentialCreationOptions</code>-Objekt mit <code>ArrayBuffer</code>-Feldern für <code>navigator.credentials.create()</code> um.

seit JavaScript WebAuthn Level 3 – Chrome/Edge 129+, Firefox 119+, Kategorie: webapi

Signatur

PublicKeyCredential.parseCreationOptionsFromJSON(options)

Beschreibung

Die statische Methode PublicKeyCredential.parseCreationOptionsFromJSON() nimmt die JSON-Darstellung von Registrierungsoptionen entgegen, wie sie ein WebAuthn-Server typischerweise liefert, und erzeugt daraus ein PublicKeyCredentialCreationOptions-Objekt. Dieses Objekt kann direkt als publicKey-Option an navigator.credentials.create() übergeben werden, um einen neuen Passkey bzw. ein neues Public-Key-Credential zu registrieren.

Das Problem, das die Methode löst: Binärfelder wie challenge, user.id und excludeCredentials[].id müssen für die WebAuthn-API als ArrayBuffer vorliegen, JSON kann aber nur Zeichenketten transportieren. Server kodieren diese Werte daher als Base64URL. Früher musste man die Dekodierung selbst schreiben oder Bibliotheken wie @github/webauthn-json einsetzen; parseCreationOptionsFromJSON() erledigt das jetzt nativ und gemäß Spezifikation.

Das Gegenstück für den Rückweg ist PublicKeyCredential.prototype.toJSON(), das das erzeugte Credential wieder in eine JSON-taugliche Form (Base64URL) umwandelt, damit es an den Server geschickt werden kann. Für den Anmeldevorgang gibt es analog PublicKeyCredential.parseRequestOptionsFromJSON().

Parameter

Name Typ Default Beschreibung
$options Pflicht PublicKeyCredentialCreationOptionsJSON (Object) Objekt mit derselben Struktur wie PublicKeyCredentialCreationOptions, jedoch mit Base64URL-kodierten Strings statt ArrayBuffer für challenge, user.id, excludeCredentials[].id sowie ggf. Binärwerte in Erweiterungen. Pflicht sind u. a. rp, user (id, name, displayName), challenge und pubKeyCredParams.

Rückgabewert

Typ
PublicKeyCredentialCreationOptions
Beschreibung
Ein Optionsobjekt, in dem alle Base64URL-Felder zu ArrayBuffer dekodiert wurden – bereit für navigator.credentials.create({ publicKey }).

Beispiele

Passkey-Registrierung mit Serveroptionen

const registerPasskey = async () => {
  // Optionen als JSON vom Server holen
  const res = await fetch('/webauthn/register/options', { method: 'POST' });
  const optionsJSON = await res.json();

  // Base64URL-Felder in ArrayBuffer umwandeln
  const publicKey = PublicKeyCredential.parseCreationOptionsFromJSON(optionsJSON);

  const credential = await navigator.credentials.create({ publicKey });

  // Ergebnis wieder als JSON zum Server schicken
  await fetch('/webauthn/register/verify', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(credential.toJSON())
  });
  console.log('Passkey registriert:', credential.id);
};

registerPasskey().catch(console.error);
Passkey registriert: AbC123...

Aufbau des JSON-Objekts und Prüfung des Ergebnisses

const optionsJSON = {
  rp: { id: 'example.com', name: 'Beispiel GmbH' },
  user: {
    id: 'dXNlci0xMjM0', // Base64URL von "user-1234"
    name: 'anna@example.com',
    displayName: 'Anna Beispiel'
  },
  challenge: 'Y2hhbGxlbmdlLTk4NzY1NDMyMQ',
  pubKeyCredParams: [
    { type: 'public-key', alg: -7 },   // ES256
    { type: 'public-key', alg: -257 }  // RS256
  ],
  timeout: 60000,
  excludeCredentials: [],
  authenticatorSelection: { residentKey: 'required', userVerification: 'preferred' },
  attestation: 'none'
};

const options = PublicKeyCredential.parseCreationOptionsFromJSON(optionsJSON);
console.log(options.challenge instanceof ArrayBuffer);
console.log(new TextDecoder().decode(options.user.id));
true user-1234

Feature-Erkennung mit Fallback

const base64urlToBuffer = (str) => {
  const b64 = str.replace(/-/g, '+').replace(/_/g, '/');
  const padded = b64 + '='.repeat((4 - (b64.length % 4)) % 4);
  return Uint8Array.from(atob(padded), (c) => c.charCodeAt(0)).buffer;
};

const toCreationOptions = (json) => {
  if (typeof PublicKeyCredential?.parseCreationOptionsFromJSON === 'function') {
    return PublicKeyCredential.parseCreationOptionsFromJSON(json);
  }
  // Manueller Fallback für ältere Browser
  return {
    ...json,
    challenge: base64urlToBuffer(json.challenge),
    user: { ...json.user, id: base64urlToBuffer(json.user.id) },
    excludeCredentials: (json.excludeCredentials ?? []).map((c) => ({
      ...c,
      id: base64urlToBuffer(c.id)
    }))
  };
};

console.log(typeof toCreationOptions);
function

// Wichtig · Fallstricke

  • Browser-Kompatibilität: Relativ neue Methode (WebAuthn Level 3). Unterstützt ab Chrome/Edge 129, Firefox 119 und Safari 18.4. Vor der Nutzung per typeof PublicKeyCredential.parseCreationOptionsFromJSON === 'function' prüfen und ggf. einen Fallback bereitstellen.
  • Fehler: Enthält das Objekt ungültiges Base64URL (z. B. Standard-Base64 mit +, / oder =-Padding bei manchen Implementierungen) oder fehlen Pflichtfelder, wirft die Methode einen EncodingError (DOMException) bzw. TypeError.
  • Keine Sicherheitsprüfung: Die Methode wandelt nur Datenformate um. Die challenge muss serverseitig zufällig erzeugt und bei der Verifizierung geprüft werden; auch Attestierung und Origin-Prüfung erfolgen ausschließlich auf dem Server.
  • WebAuthn funktioniert nur in einem sicheren Kontext (HTTPS oder localhost); rp.id muss zur aktuellen Domain passen.
  • Nicht mit parseRequestOptionsFromJSON() verwechseln – diese ist für die Anmeldung (navigator.credentials.get()) gedacht.