Start · Sprachen · JavaScript · Referenz · CredentialsContainer.preventSilentAccess()

CredentialsContainer.preventSilentAccess()

Methode

Setzt für den aktuellen Ursprung ein Flag, das die automatische, stille Anmeldung bei künftigen Besuchen verhindert, und gibt ein <code>Promise&lt;undefined&gt;</code> zurück.

seit JavaScript Chrome/Edge 60+, Opera 47+; Firefox und Safari unt Kategorie: webapi

Signatur

navigator.credentials.preventSilentAccess()

Beschreibung

Die Methode preventSilentAccess() des CredentialsContainer-Interfaces (erreichbar über navigator.credentials) setzt im Credential-Speicher des Browsers das Flag prevent silent access für den aktuellen Ursprung. Solange dieses Flag gesetzt ist, liefert navigator.credentials.get() mit mediation: "silent" keine Zugangsdaten mehr. Mit mediation: "optional" (dem Standardwert) wird dem Nutzer dann eine Kontoauswahl angezeigt, statt ihn ohne Rückfrage anzumelden.

Typischer Einsatzort ist der Logout. Meldet sich ein Nutzer ab, soll ihn die Seite beim nächsten Aufruf nicht sofort wieder automatisch anmelden. Das wäre verwirrend und auf gemeinsam genutzten Geräten ein Sicherheitsproblem. Deshalb sollte man preventSilentAccess() immer aufrufen, wenn die Sitzung serverseitig beendet wird.

Das Flag wird erst wieder gelöscht, wenn der Nutzer sich aktiv über die Kontoauswahl des Browsers anmeldet (Mediation), wenn navigator.credentials.store() aufgerufen wird oder wenn er seine Browserdaten löscht. Die Methode braucht keine Parameter und beeinflusst nur den Ursprung, von dem aus sie aufgerufen wird.

Rückgabewert

Typ
Promise<undefined>
Beschreibung
Ein Promise, das mit undefined erfüllt wird, sobald das Flag gesetzt ist.

Beispiele

Logout mit Sperre der automatischen Anmeldung

const logout = async () => {
  // Sitzung zuerst serverseitig beenden
  await fetch('/api/logout', { method: 'POST', credentials: 'same-origin' });

  // Stille Anmeldung beim nächsten Besuch verhindern
  if (navigator.credentials?.preventSilentAccess) {
    await navigator.credentials.preventSilentAccess();
  }

  console.log('Abgemeldet, automatische Anmeldung deaktiviert');
  location.href = '/login';
};

document.querySelector('#logout-btn').addEventListener('click', logout);
Abgemeldet, automatische Anmeldung deaktiviert

Auswirkung auf eine stille Anmeldung

const trySilentLogin = async () => {
  const cred = await navigator.credentials.get({
    password: true,
    mediation: 'silent'
  });
  console.log(cred ? `Angemeldet als ${cred.id}` : 'Keine stille Anmeldung möglich');
};

await navigator.credentials.preventSilentAccess();
await trySilentLogin();
Keine stille Anmeldung möglich

Nach dem Logout eine Kontoauswahl anbieten

const loginWithPicker = async () => {
  // mediation 'optional': der Browser zeigt nach preventSilentAccess() die Kontoauswahl
  const cred = await navigator.credentials.get({
    password: true,
    mediation: 'optional'
  });
  if (cred?.type === 'password') {
    const body = new FormData();
    body.append('username', cred.id);
    body.append('password', cred.password);
    const res = await fetch('/api/login', { method: 'POST', body });
    console.log(res.ok ? 'Login erfolgreich' : 'Login fehlgeschlagen');
  }
};

document.querySelector('#login-btn').addEventListener('click', loginWithPicker);
Login erfolgreich

// Wichtig · Fallstricke

  • Nur in sicheren Kontexten: navigator.credentials gibt es nur über HTTPS (oder localhost). Vor dem Aufruf per Feature-Erkennung prüfen, ob die API vorhanden ist.
  • Browser-Unterstützung: Chromium-basierte Browser unterstützen die Methode vollständig. Firefox und Safari stellen sie bereit, haben aber keine PasswordCredential-Unterstützung. Dort wirkt sie sich vor allem auf föderierte oder Public-Key-Credentials aus.
  • Kein Ersatz für einen serverseitigen Logout: Die Methode löscht weder Cookies noch Sitzungen noch gespeicherte Passwörter. Sie verhindert lediglich, dass die Seite künftig ohne Rückfrage Zugangsdaten erhält.
  • Ein späterer Aufruf von navigator.credentials.store() oder eine Anmeldung über die Kontoauswahl löscht das Flag wieder.
  • Die frühere Bezeichnung requireUserMediation() ist veraltet und sollte nicht mehr verwendet werden.
  • In iframes funktioniert die Methode nur, wenn die Berechtigungsrichtlinie (Permissions Policy) es erlaubt, zum Beispiel publickey-credentials-get bzw. identity-credentials-get.