Start · Sprachen · JavaScript · Referenz · XMLHttpRequest.setPrivateToken()

XMLHttpRequest.setPrivateToken()

Methode

Hängt an einen <code>XMLHttpRequest</code> Informationen zu einem privaten Status-Token an, damit dieser Token ausgibt, einlöst oder einen Einlösungsnachweis mitsendet.

seit JavaScript Experimentell: nur Chromium-basierte Browser (Chro Kategorie: webapi

Signatur

XMLHttpRequest.prototype.setPrivateToken(privateToken)

Beschreibung

setPrivateToken() gehört zur Private State Token API (früher „Trust Tokens“). Damit können Websites Vertrauenssignale („dieser Nutzer ist vermutlich kein Bot“) seitenübergreifend weitergeben, ohne dass der Nutzer darüber verfolgt werden kann. Ein Aussteller (Issuer) gibt kryptografisch verblindete Token aus. Andere Seiten können sie später einlösen und bekommen dafür einen Einlösungsnachweis (Redemption Record, RR), den sie an ihre Server schicken.

Die Methode legt fest, welche dieser Operationen der folgende Request ausführen soll. Die Werte entsprechen der Option privateToken von fetch():

  • "token-request": neue Token beim Aussteller anfordern.
  • "token-redemption": ein vorhandenes Token einlösen und einen Einlösungsnachweis erhalten.
  • "send-redemption-record": gespeicherte Einlösungsnachweise der angegebenen Aussteller im Header Sec-Redemption-Record an den Zielserver mitsenden.

Rufe die Methode nach open() und vor send() auf. Den kryptografischen Teil (Header Sec-Private-State-Token) erledigt der Browser selbst. Dein Code legt nur die Operation fest und bestimmt, an welchen Server der Request geht. Für neuen Code ist meist fetch() mit der Option privateToken die bessere Wahl. setPrivateToken() ist für bestehenden Code gedacht, der auf XMLHttpRequest aufbaut.

Parameter

Name Typ Default Beschreibung
$privateToken Pflicht Object Objekt, das die Token-Operation beschreibt. Enthält folgende Eigenschaften:
  • version (number, Pflicht): Protokollversion, derzeit immer 1.
  • operation (string, Pflicht): "token-request", "token-redemption" oder "send-redemption-record".
  • refreshPolicy (string, optional, Standard "none"): nur bei "token-redemption". "none" nimmt einen noch gültigen, zwischengespeicherten Einlösungsnachweis. "refresh" erzwingt einen neuen.
  • issuers (string[]): nur bei "send-redemption-record", dort Pflicht. Liste von Aussteller-URLs, deren Einlösungsnachweise mitgesendet werden.

Rückgabewert

Typ
void
Beschreibung
Keiner (undefined). Das Ergebnis der Operation kommt erst mit der Antwort des Requests. Beim Token-Abruf speichert der Browser die Token intern, beim Einlösen den Einlösungsnachweis.

Beispiele

Token beim Aussteller anfordern (Ausgabe)

const issuer = 'https://issuer.example';

// Nur Token anfordern, wenn noch keine vorhanden sind
const hasToken = await document.hasPrivateToken(issuer);

if (!hasToken) {
  const xhr = new XMLHttpRequest();
  xhr.open('GET', `${issuer}/.well-known/private-state-token/issuance`);
  xhr.setPrivateToken({
    version: 1,
    operation: 'token-request'
  });
  xhr.onload = () => console.log('Token-Ausgabe abgeschlossen, Status:', xhr.status);
  xhr.onerror = () => console.error('Token-Ausgabe fehlgeschlagen');
  xhr.send();
}
Token-Ausgabe abgeschlossen, Status: 200

Token einlösen und Einlösungsnachweis erzwingen

const issuer = 'https://issuer.example';

const xhr = new XMLHttpRequest();
xhr.open('GET', `${issuer}/.well-known/private-state-token/redemption`);

try {
  xhr.setPrivateToken({
    version: 1,
    operation: 'token-redemption',
    refreshPolicy: 'refresh' // neuen Nachweis erzwingen statt Cache nutzen
  });
  xhr.onload = async () => {
    const hasRecord = await document.hasRedemptionRecord(issuer);
    console.log('Einlösungsnachweis vorhanden:', hasRecord);
  };
  xhr.send();
} catch (err) {
  // z. B. NotAllowedError, wenn die Permissions Policy die Einlösung verbietet
  console.error(`${err.name}: ${err.message}`);
}
Einlösungsnachweis vorhanden: true

Einlösungsnachweis an den eigenen Server senden

const sendTrustSignal = (payload) => new Promise((resolve, reject) => {
  const xhr = new XMLHttpRequest();
  xhr.open('POST', '/api/checkout');
  xhr.setRequestHeader('Content-Type', 'application/json');

  // Der Browser hängt den Header Sec-Redemption-Record an
  xhr.setPrivateToken({
    version: 1,
    operation: 'send-redemption-record',
    issuers: ['https://issuer.example']
  });

  xhr.onload = () => resolve(xhr.status);
  xhr.onerror = () => reject(new Error('Netzwerkfehler'));
  xhr.send(JSON.stringify(payload));
});

const status = await sendTrustSignal({ cartId: 42 });
console.log('Server-Antwort:', status);
Server-Antwort: 200

Feature-Erkennung vor der Nutzung

const supportsPrivateTokens =
  typeof XMLHttpRequest !== 'undefined' &&
  'setPrivateToken' in XMLHttpRequest.prototype;

console.log(supportsPrivateTokens
  ? 'Private State Tokens per XHR verfügbar'
  : 'Nicht unterstützt – auf andere Anti-Betrugs-Maßnahmen ausweichen');
Private State Tokens per XHR verfügbar

// Wichtig · Fallstricke

Kompatibilität: Die API ist experimentell und nicht standardisiert. Sie läuft nur in Chromium-basierten Browsern (Chrome, Edge, Opera). Firefox und Safari unterstützen sie nicht. Prüfe deshalb immer vorher, ob setPrivateToken vorhanden ist, und sieh eine Alternative vor.

Aufrufreihenfolge: Wird die Methode vor open() oder nach send() aufgerufen, wirft sie eine InvalidStateError-DOMException.

Permissions Policy: Die Ausgabe erfordert die Direktive private-state-token-issuance, das Einlösen und Senden private-state-token-redemption. Blockiert die Policy die Operation, zum Beispiel in einem eingebetteten iframe ohne allow-Attribut, entsteht eine NotAllowedError. Ein fehlerhaftes privateToken-Objekt (etwa send-redemption-record ohne issuers) führt zu einem TypeError.

Weitere Fallstricke:

  • Aussteller müssen bei Chrome registriert sein. Nicht registrierte Aussteller werden ignoriert.
  • Die Zahl der Einlösungen pro Aussteller und Top-Level-Seite ist begrenzt (Rate-Limit). Mit refreshPolicy: "refresh" verbrauchst du dieses Kontingent schnell.
  • Einlösungsnachweise sind nur ein Vertrauenssignal und kein Identitätsnachweis. Dein Server muss sie selbst prüfen, zum Beispiel über Signatur und Ablaufdatum.