Die WebOTP API kann jetzt OTPs innerhalb von iFrames empfangen.
SMS-OTPs (Einmalpasswörter) werden häufig zur Bestätigung von Telefonnummern verwendet, z. B. als zweiter Schritt bei der Authentifizierung oder zur Bestätigung von Zahlungen im Web. Wenn Sie jedoch zwischen dem Browser und der SMS-App wechseln, um das OTP zu kopieren und einzufügen oder manuell einzugeben, können leicht Fehler auftreten und die Nutzerfreundlichkeit wird beeinträchtigt.
Mit der WebOTP API können Websites das Einmalpasswort programmatisch aus einer SMS abrufen und automatisch mit nur einem Tippen in das Formular für die Nutzer eingeben, ohne die App wechseln zu müssen. Die SMS ist speziell formatiert und an den Ursprung gebunden, wodurch die Wahrscheinlichkeit verringert wird, dass Phishing-Websites das Einmalpasswort stehlen.
Ein Anwendungsfall, der in WebOTP noch nicht unterstützt wird, ist das Targeting auf einen Ursprung innerhalb eines iframe. Dieser wird in der Regel für die Zahlungsbestätigung verwendet, insbesondere bei 3D Secure. Da die WebOTP API das gängige Format zur Unterstützung von iframes mit unterschiedlichen Ursprüngen ist, liefert sie ab Chrome 91 OTPs, die an verschachtelte Ursprünge gebunden sind.
Funktionsweise der WebOTP API
Die WebOTP API selbst ist recht einfach:
…
const otp = await navigator.credentials.get({
otp: { transport:['sms'] }
});
…
Die SMS-Nachricht muss mit den an die Quelle gebundenen Einmalcodes formatiert sein.
Your OTP is: 123456.
@web-otp.glitch.me #12345
Beachten Sie, dass in der letzten Zeile der zu bindende Ursprung mit einer @
gefolgt vom OTP mit einer #
vorangestellt ist.
Wenn die SMS eingeht, wird eine Infoleiste eingeblendet, in der der Nutzer aufgefordert wird, seine Telefonnummer zu bestätigen. Nachdem der Nutzer auf die Schaltfläche Verify
geklickt hat, leitet der Browser das OTP automatisch an die Website weiter und löst die navigator.credentials.get()
auf. Die Website kann dann die OTP extrahieren und den Bestätigungsvorgang abschließen.
Informationen zu den Grundlagen der Verwendung von WebOTP
Anwendungsfälle für iframes mit unterschiedlichen Ursprüngen
Die Eingabe eines OTP in einem Formular in einem herkunftsübergreifenden iFrame ist in Zahlungsszenarien üblich. Einige Kreditkartenaussteller verlangen einen zusätzlichen Bestätigungsschritt, um die Echtheit des Zahlungspflichtigen zu überprüfen. Dieser Vorgang wird als 3D Secure bezeichnet. Das Formular wird in der Regel in einem Iframe auf derselben Seite angezeigt, als wäre es Teil des Zahlungsvorgangs.
Beispiel:
- Ein Nutzer besucht
shop.example
, um ein Paar Schuhe mit einer Kreditkarte zu kaufen. - Nach der Eingabe der Kreditkartennummer zeigt der integrierte Zahlungsanbieter in einem Iframe ein Formular von
bank.example
an, in dem der Nutzer aufgefordert wird, seine Telefonnummer für den schnellen Bezahlvorgang zu bestätigen. bank.example
sendet dem Nutzer eine SMS mit einem OTP, das er zur Bestätigung seiner Identität eingeben kann.
WebOTP API über einen iframe mit unterschiedlichen Ursprüngen verwenden
Wenn Sie die WebOTP API in einem iframe mit unterschiedlichen Ursprüngen verwenden möchten, müssen Sie zwei Dinge tun:
- Fügen Sie in der SMS-Textnachricht sowohl den Ursprung des Top-Frames als auch den des iFrames hinzu.
- Konfigurieren Sie die Berechtigungsrichtlinie so, dass der iframe mit unterschiedlichen Ursprüngen OTP direkt vom Nutzer empfangen kann.
Sie können die Demo selbst unter https://web-otp-iframe-demo.stackblitz.io ausprobieren.
gebundene Ursprünge in der SMS-Textnachricht annotieren
Wenn die WebOTP API innerhalb eines Iframes aufgerufen wird, muss die SMS-Textnachricht den Ursprung des Top-Frames mit vorangestelltem @
, gefolgt vom OTP mit vorangestelltem #
und gefolgt vom Ursprung des Iframes mit vorangestelltem @
enthalten.
@shop.example #123456 @bank.exmple
Berechtigungsrichtlinie konfigurieren
Wenn WebOTP in einem iframe mit unterschiedlichen Ursprüngen verwendet werden soll, muss der Einbettungscode-Anbieter über die Berechtigungsrichtlinie für otp-Anmeldedaten Zugriff auf diese API gewähren, um unbeabsichtigtes Verhalten zu vermeiden. Im Allgemeinen gibt es zwei Möglichkeiten, dieses Ziel zu erreichen:
- Über den HTTP-Header:
Permissions-Policy: otp-credentials=(self "https://bank.example")
- Über das iFrame-Attribut
allow
:
<iframe src="https://bank.example/…" allow="otp-credentials"></iframe>
Weitere Beispiele für die Angabe einer Berechtigungsrichtlinie
Vorsichtsmaßnahmen
Verschachtelungsebenen
Derzeit unterstützt Chrome nur WebOTP API-Aufrufe von ursprungsübergreifenden iFrames, die höchstens einen eindeutigen Ursprung in der übergeordneten Kette haben. In den folgenden Fällen:
- a.com -> b.com
- a.com -> b.com -> b.com
- a.com -> a.com -> b.com
- a.com -> b.com -> c.com
Die Verwendung von WebOTP in b.com wird unterstützt, in c.com jedoch nicht.
Das folgende Szenario wird aufgrund mangelnder Nachfrage und komplexer UX ebenfalls nicht unterstützt.
- a.com -> b.com -> a.com (ruft die WebOTP API auf)
Interoperabilität
Andere Browser-Engines als Chromium implementieren die WebOTP API nicht. Safari verwendet jedoch dasselbe SMS-Format wie input[autocomplete="one-time-code"]
. Sobald in Safari eine SMS mit einem an den Ursprung gebundenen Einmalcode-Format mit dem übereinstimmenden Ursprung eingeht, schlägt die Tastatur vor, den OTP in das Eingabefeld einzugeben.
Seit April 2021 unterstützt Safari iframes mit einem eindeutigen SMS-Format mit %
.
Da in der Spezifikationsdiskussion jedoch @
als Standard festgelegt wurde, hoffen wir, dass die Implementierung des unterstützten SMS-Formats konvergiert.
Feedback
Ihr Feedback hilft uns, die WebOTP API zu verbessern. Probieren Sie sie also aus und teilen Sie uns mit, was Sie davon halten.
Ressourcen
- Telefonnummern im Web mit der Web OTP API bestätigen
- Best Practices für SMS-OTP-Formulare
- WebOTP API
- Herkunftsgebundene Einmalcodes, die per SMS gesendet werden
Foto von rupixen.com auf Unsplash