Die WebOTP API kann jetzt OTPs aus iFrames empfangen.
SMS-OTPs (Einmalpasswörter) werden häufig verwendet, um Telefonnummern zu bestätigen, z. B. als zweiter Schritt bei der Authentifizierung, oder um Zahlungen im Web zu bestätigen. 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-Nachricht abrufen und automatisch durch einmaliges Tippen in das Formular eingeben, ohne die App zu wechseln. Die SMS ist speziell formatiert und an den Ursprung gebunden. Dadurch wird die Wahrscheinlichkeit verringert, dass Phishing-Websites das OTP stehlen können.
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 den Ursprung gebundenen Einmalcodes formatiert sein.
Your OTP is: 123456.
@web-otp.glitch.me #12345
Beachten Sie, dass sie in der letzten Zeile den Ursprung enthält, dem ein @
vorangestellt werden soll, gefolgt von dem OTP mit vorangestelltem #
.
Wenn die Textnachricht 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 das 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. Bei einigen Kreditkartenausstellern ist ein zusätzlicher Bestätigungsschritt erforderlich, um die Authentizität 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:
- im 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 zum Angeben 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.de -> b.de
- a.com -> b.com -> b.com
- a.de -> a.de -> b.de
- a.com -> b.com -> c.com
Die Verwendung von WebOTP in b.com wird unterstützt, die Verwendung 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
Die WebOTP API wird zwar in anderen Browser-Engines als Chromium nicht implementiert, aber Safari verwendet dasselbe SMS-Format wie die input[autocomplete="one-time-code"]
-Unterstützung. 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 ist für die Verbesserung der WebOTP API von unschätzbarem Wert. Probieren Sie es also aus und teilen Sie uns Ihre Meinung mit.
Ressourcen
- Telefonnummern im Web mit der Web OTP API bestätigen
- Best Practices für das OTP-Formular für SMS
- WebOTP API
- Herkunftsgebundene Einmalcodes, die per SMS gesendet werden
Foto von rupixen.com auf Unsplash