Zum Inhalt springen
ecdsa.com
SimpleWebAuthn (@simplewebauthn/server)WebAuthn und Passkeys

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

So behebst du den Fehler

  1. 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. 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",
    });

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen