Fehlermeldung
Unexpected registration response origin "http://localhost:3000", expected "https://app.example.com"
Auch ausgegeben als
- Unexpected authentication response origin "http://localhost:3000", expected "https://app.example.com"
- Unexpected registration response challenge "b3RoZXI", expected "c2VydmVyLWNoYWxsZW5nZS0xMjM"
Der erste Wert in Anführungszeichen ist der Origin, den der Browser gemeldet hat, der zweite deine Konfiguration. Bei der Anmeldung lautet der Text „authentication response“; eine nicht passende Challenge erzeugt in derselben Bibliothek „Unexpected registration response challenge …“.
SimpleWebAuthn (@simplewebauthn/server) — verifyRegistrationResponse / verifyAuthenticationResponse
Was der Fehler bedeutet
Der Browser hat den Origin der Seite in `clientDataJSON` festgehalten (den Daten, die der Authenticator signiert), und dieser weicht vom `expectedOrigin` ab, den dein Server an SimpleWebAuthn übergeben hat. Die Prüfung soll verhindern, dass eine Credential-Zeremonie, die auf einer Website ausgeführt wurde – etwa auf einer täuschend ähnlichen Phishing-Seite –, von einer anderen akzeptiert wird. Am Authenticator ist nichts falsch; die Vorstellung des Servers davon, wo seine Seiten liegen, passt nicht zu dem Ort, an dem die Zeremonie tatsächlich lief.
Warum der Fehler auftritt
Produktions-Origin in der Entwicklung konfiguriert (oder umgekehrt)
häufig`expectedOrigin` ist auf die Produktions-URL hartkodiert, während du auf `http://localhost:3000`, einem Preview-Deployment oder einer Tunnel-URL (ngrok, Cloudflare Tunnel) testest.
Die Anmeldeseite wird von mehreren Origins ausgeliefert
häufig`www.` und die Apex-Domain, mehrere Länderdomains oder eine separate Subdomain `accounts.`. Jeder Origin, auf dem die Zeremonie laufen kann, muss aufgeführt sein.
Eine native Android-App
gelegentlichCredential Manager meldet `android:apk-key-hash:…` als Origin, nicht deinen Web-Origin. Der Hash des Signaturschlüssels der App muss in `expectedOrigin` stehen.
So behebst du den Fehler
- 1.
Jeden legitimen Origin explizit aufführen
`expectedOrigin` akzeptiert ein Array. Trage nur Origins ein, die dir gehören; übernimm den Origin nie aus der Anfrage selbst.
js const verification = await verifyRegistrationResponse({ response: body, expectedChallenge: session.currentChallenge, // Every origin that legitimately hosts your sign-up page, exactly as browsers report it: expectedOrigin: ["https://app.example.com", "https://www.example.com"], expectedRPID: "example.com", }); - 2.
Origin der Android-App hinzufügen
Berechne den SHA-256-Hash des Signaturzertifikats der App als base64url und füge ihn in der Form `android:apk-key-hash:` hinzu.
js // Android apps report "android:apk-key-hash:<base64url SHA-256 of the app signing certificate>". // SHA-256 fingerprint from Play Console or: keytool -list -v -keystore release.jks | grep SHA256 const fingerprintHex = process.env.ANDROID_SIGNING_CERT_SHA256.replaceAll(":", ""); const androidOrigin = "android:apk-key-hash:" + Buffer.from(fingerprintHex, "hex").toString("base64url"); const verification = await verifyRegistrationResponse({ response: body, expectedChallenge: session.currentChallenge, expectedOrigin: ["https://example.com", androidOrigin], expectedRPID: "example.com", });