Handbuch wien.gv.at
Startseite wien.gv.at
Menü

One Time Password (OTP) – Eingabe von Einmalpasswörtern

Komponente zur Eingabe eines einmaligen Passworts (OTP). Sie besteht aus mehreren Eingabefeldern, die zusammen einen Code bilden. Sie kann zur Anmeldung oder Bestätigung von Aktionen eingesetzt werden. Die Komponente ist eigenständig, das heißt, es öffnet sich ein Screen, in dem nur diese Aktion durchführbar ist.

Die Komponente unterstützt Formulare, Validierung, das Einfügen eines kompletten Codes, ein verstecktes Autocomplete-Feld für One-Time-Codes sowie optional einen Countdown.

Verhalten

Alle Eingaben werden zu einem Wert zusammengefasst. Dieser Wert ist über die Eigenschaft value verfügbar.

Eingabe

Im Modus numeric sind nur Zahlen erlaubt. Im Modus text sind alle Zeichen erlaubt, aber nur bis zur maximalen Anzahl der Felder.

Formularintegration

Die Komponente verwendet die Form-Associated API.

Der Wert wird über ein verstecktes Eingabefeld an das Formular übergeben. Der Name dieses Feldes kommt von der Eigenschaft name.

Validierung

Wenn required aktiv ist, müssen alle Felder ausgefüllt sein. Sonst ist die Eingabe ungültig.

Eigene Fehler können über error gesetzt werden. Mit reportValidity() wird die Eingabe geprüft.

Events

Das Event input wird bei jeder Änderung ausgelöst.

Das Event change wird ausgelöst, wenn die Eingabe geändert wurde und das Feld den Fokus verliert.

Wenn alle Felder ausgefüllt sind, werden complete und wm-filled ausgelöst.

Wenn die Zeit abläuft, wird wm-timed-out gesendet.

Countdown

Der Timer wird mit startTimer() gestartet.

Nach der Zeit countdownTime wird ein Text angezeigt. Dabei wird auch das Event wm-timed-out ausgelöst.

Varianten

OTP: Anmeldung mit einem 6-stelligen Code

Gemischter Code aus Buchstaben und Zahlen.

Vorschau Code
<wm-otp name="signin-code-6" label="SMS-Code" value="1234a6" required numberOfFields="6" inputMode="text"></wm-otp>

OTP: Anmeldung mit einem 4-stelligen Code

Der Code enthält nur Zahlen.

Vorschau Code
<wm-otp name="signin-code-4" label="SMS-Code" value="2222" required numberOfFields="4" inputMode="numeric"></wm-otp>

OTP: Anmeldung mit einem 6-stelligen Code

Ein 6-stelliger Code mit individuellem Pflichttext und Hilfetext.

Vorschau
Wir senden den Code an Ihre hinterlegte E-Mail-Adresse.
Code
<wm-otp
name="recovery-code"
label="Wiederherstellungscode"
numberOfFields="6"
required
requiredText="Bitte den Wiederherstellungscode eingeben"
hideAsterisk
>

<div slot="hint">Wir senden den Code an Ihre hinterlegte E-Mail-Adresse.</div>
</wm-otp>

OTP: Fehlerzustand bei Validierung

Zeigt, wie ein ungültiger oder abgelaufener Code den Nutzer*innen mitgeteilt wird.

Vorschau Code
<wm-otp
name="invalid-code"
label="Code bestätigen"
value="1111"
error="Der eingegebene Code ist ungültig."
required
>
</wm-otp>

OTP: Ablauf eines zeitbasierten Codes

Countdown-Mitteilung für kurzlebige Verifikationscodes.

Vorschau Code
<wm-otp
id="countdown-demo"
name="countdown-code"
label="Code läuft bald ab"
numberOfFields="6"
countdownTime="10"
countdownText="Der Code läuft in [COUNTDOWNTIME] Sekunden ab."
countdownEndedText="Der Code ist abgelaufen. Bitte fordern Sie einen neuen an."
required
>
</wm-otp>
<script type="module">
const initCountdownDemo = async () => {
if (!customElements.get('wm-otp')) {
await customElements.whenDefined('wm-otp');
}

const otp = document.getElementById('countdown-demo');
if (!otp) {
return;
}
otp.startTimer();
otp.addEventListener('wm-timed-out', () => {
console.log('Countdown ended for OTP component.');
});
};

initCountdownDemo();
</script>

OTP: Deaktivierter/schreibgeschützter Zustand

Wird für Prüf- oder Review-Szenarien verwendet, in denen die Nutzer*innen den Wert nicht ändern können.

Vorschau Code
<wm-otp name="disabled-code" label="Code im Prüfmodus" value="987654" disabled></wm-otp>

OTP: Fehlerbehandlung mit anschließend gültigem Code

Zeigt einen Fehlerzustand bei falscher Eingabe und löscht ihn, sobald der vollständige Code korrigiert (korrekter Code lautet 1234) wurde.

Vorschau

Code
<wm-otp
id="error-recovery-demo"
name="error-recovery-demo"
label="Code überprüfen"
numberOfFields="4"
required
>
</wm-otp>
<p id="error-recovery-status" aria-live="polite"></p>
<script type="module">
const initErrorRecoveryDemo = async () => {
if (!customElements.get('wm-otp')) {
await customElements.whenDefined('wm-otp');
}

const otp = document.getElementById('error-recovery-demo');
const status = document.getElementById('error-recovery-status');

if (!otp || !status) {
return;
}

const showStatus = (message) => {
status.textContent = message;
};

otp.addEventListener('complete', () => {
const value = otp.value || '';
if (value === '1234') {
otp.error = '';
showStatus('Der Code wurde korrekt eingegeben. Der Fehlerzustand wurde entfernt.');
} else {
otp.error = 'Der eingegebene Code ist falsch. Bitte versuchen Sie es erneut.';
showStatus('Der eingegebene Code ist falsch. Bitte versuchen Sie es erneut.');
}
});

otp.addEventListener('input', () => {
if (!otp.error) {
return;
}

if (otp.value?.length === otp.numberOfFields) {
const currentValue = otp.value || '';
if (currentValue === '1234') {
otp.error = '';
showStatus('Der Code wurde korrekt eingegeben. Der Fehlerzustand wurde entfernt.');
}
}
});

otp.addEventListener('change', () => {
if (!otp.error) {
return;
}

if ((otp.value || '').length === otp.numberOfFields && otp.value !== '1234') {
otp.error = 'Der eingegebene Code ist falsch. Bitte versuchen Sie es erneut.';
showStatus('Der eingegebene Code ist falsch. Bitte versuchen Sie es erneut.');
}
});
};

initErrorRecoveryDemo();
</script>

OTP: Weiterleitung nach erfolgreicher Eingabe

Zeigt eine Weiterleitung zum nächsten Schritt nach vollständiger Eingabe (korrekter Code lautet 1234).

Vorschau

Code
<wm-otp id="redirect-demo" name="redirect-demo" label="Weiterleitungstest" numberOfFields="4" required></wm-otp>
<p id="redirect-demo-status" aria-live="polite"></p>
<script type="module">
const initRedirectDemo = async () => {
if (!customElements.get('wm-otp')) {
await customElements.whenDefined('wm-otp');
}

const otp = document.getElementById('redirect-demo');
const status = document.getElementById('redirect-demo-status');

if (!otp || !status) {
return;
}

const showStatus = (message) => {
status.textContent = message;
};

otp.addEventListener('complete', () => {
const value = otp.value || '';
if (value === '1234') {
otp.error = '';
showStatus('Der Code wurde korrekt eingegeben. Der Fehlerzustand wurde entfernt.');
showStatus('Weiterleitung zum nächsten Schritt…');
window.location.href = '/pattern-library/patterns/OneTimePassword/otp/#redirect-demo';
} else {
otp.error = 'Der eingegebene Code ist falsch. Bitte versuchen Sie es erneut.';
showStatus('Der eingegebene Code ist falsch. Bitte versuchen Sie es erneut.');
}
});
};

initRedirectDemo();
</script>

OTP: Public-API-Playground

Testet die Host-API direkt mit Beispielaktionen.

Vorschau

Code
<wm-otp
id="api-playground"
name="api-playground-code"
label="API Playground"
required
numberOfFields="4"
countdownTime="5"
inputMode="text"
countdownText="Der Code läuft in [COUNTDOWNTIME] Sekunden ab."
countdownEndedText="Der Code ist abgelaufen. Bitte fordern Sie einen <a href='#'>neuen Code</a> an."
required>
</wm-otp>
<wm-stack horizontal="true" gap="xxs" wrap="true">
<button type="button" data-action="set-value">Beispielwert</button>
<button type="button" data-action="reset">Zurücksetzen</button>
<button type="button" data-action="validate">Validieren</button>
<button type="button" data-action="start-timer">Countdown starten</button>
<button type="button" data-action="set-error">Fehler setzen</button>
<button type="button" data-action="clear-error">Fehler löschen</button>
</wm-stack>
<p id="api-playground-status" aria-live="polite"></p>
<script type="module">
const setStatus = (message) => {
const output = document.getElementById('api-playground-status');
if (output) {
output.textContent = message;
}
};

const initApiPlayground = async () => {
if (!customElements.get('wm-otp')) {
await customElements.whenDefined('wm-otp');
}

const otp = document.getElementById('api-playground');
if (!otp) {
return;
}

document.querySelectorAll('[data-action]').forEach((button) => {
button.addEventListener('click', () => {
const action = button.getAttribute('data-action');
switch (action) {
case 'set-value': {
otp.value = '1234';
setStatus('Beispielwert auf dem Host gesetzt.');
break;
}
case 'reset': {
otp.reset();
setStatus('OTP-Komponente zurückgesetzt.');
break;
}
case 'validate': {
const valid = otp.reportValidity();
setStatus(valid ? 'Validierung erfolgreich.' : 'Validierung fehlgeschlagen.');
break;
}
case 'start-timer': {
otp.startTimer();
setStatus('Countdown-Timer gestartet.');
break;
}
case 'set-error': {
otp.error = 'Der eingegebene Code ist ungültig.';
setStatus('Benutzerdefinierter Fehlerzustand gesetzt.');
break;
}
case 'clear-error': {
otp.error = '';
setStatus('Benutzerdefinierter Fehlerzustand gelöscht.');
break;
}
default:
break;
}
});
});
};

initApiPlayground();
</script>
API

wm-otp

Eigenschaften

Eigenschaften
Eigenschaft Beschreibung Werte Default
label Setzt die sichtbare Beschriftung der OTP-Gruppe. string
countdownText Setzt den Countdown-Text mit optionalem Platzhalter. string
countdownEndedText Setzt den Text für den abgelaufenen Countdown. Unsafe HTML ist erlaubt, um Links einzubinden. string
requiredText Setzt den Pflichtfeld-Text. string
error Setzt die Fehlermeldung und aktualisiert den Error-State der Komponente. string
value Setzt den OTP-Wert und normalisiert ihn entsprechend den aktuellen Regeln. string ""
numberOfFields Setzt die Anzahl der sichtbaren OTP-Felder. number 4
inputMode Setzt den Eingabemodus. string "numeric"
complete Gibt zurück, ob alle sichtbaren OTP-Felder befüllt sind.
name Name für die Teilnahme an Formularen und die Form-Submission. string ""
required Markiert das Feld als Pflichtfeld. boolean false
disabled Deaktiviert alle sichtbaren Eingabefelder und das versteckte Hidden-Input. boolean false
hideAsterisk Blendet den visuellen Pflichtstern aus und verwendet stattdessen den Pflichttext. boolean false
countdownTime Countdown-Dauer in Sekunden. number 60

Slots

Name Beschreibung
hint Optionaler Hinweistext unterhalb der Beschriftung.

Methoden

Eigenschaft Optionen Argumente
reset Löscht den aktuellen OTP-Wert und setzt den internen Änderungsstatus zurück. /
startTimer Startet den Countdown mit der aktuellen Dauer aus countdownTime. /

Events

Event Beschreibung Rückgabewert
wm-filled Wird ausgelöst, wenn alle Felder befüllt sind.
complete Wird ausgelöst, wenn alle Felder befüllt sind.
input Wird bei jeder Änderung des OTP-Werts ausgelöst.
change Wird nach Verlassen des Steuerelements bei einer bestätigten Änderung ausgelöst.
invalid Wird über reportValidity() bei einem ungültigen Zustand ausgelöst.
wm-timed-out Wird ausgelöst, wenn der Countdown abgelaufen ist.

Kontakt

Haben Sie noch Fragen, Feedback oder brauchen Sie ein Element, das die Pattern Library noch nicht bietet?

handbuch@ma53.wien.gv.at