Fehlermeldung
SecurityError: The relying party ID is not a registrable domain suffix of, nor equal to the current domain. Subsequently, an attempt to fetch the .well-known/webauthn resource of the claimed RP ID failed.
Auch ausgegeben als
- SecurityError: The relying party ID is not a registrable domain suffix of, nor equal to the current domain.
Chromium-Versionen ohne Unterstützung für Related Origin Requests beenden den Satz nach „…nor equal to the current domain.“. Andere Browser formulieren es anders; der DOMException-Name `SecurityError` ist der stabile Teil.
WebAuthn navigator.credentials.create() / get() — DOMException SecurityError (Chromium)
Was der Fehler bedeutet
Die RP-ID in deinen Optionen ist weder der Hostname der Seite selbst noch eine registrierbare übergeordnete Domain davon, deshalb hat der Browser es abgelehnt, dafür ein Credential zu erstellen oder zu verwenden. Ein Passkey ist an seine RP-ID gebunden; dürfte jede Seite jede beliebige RP-ID beanspruchen, könnte eine Website die Passkeys einer anderen verwenden. Chromium hat außerdem den WebAuthn-Mechanismus Related Origin Requests versucht (Abruf von `https://<rp-id>/.well-known/webauthn`, um zu sehen, ob die RP-ID deinen Origin aufführt), und auch dieser hat die Anfrage nicht autorisiert.
Warum der Fehler auftritt
Produktions-RP-ID auf einem Entwicklungs- oder Preview-Host
häufig`rp.id: "app.example.com"` wird an eine Seite auf `localhost`, unter einer Preview-Deployment-URL (`*.vercel.app`, `*.netlify.app`) oder auf einer Staging-Domain gesendet. Die RP-ID muss zu der Umgebung passen, aus der die Seite ausgeliefert wird.
Eine benachbarte oder untergeordnete Domain als RP-ID
häufigEine Seite auf `login.example.com` darf `login.example.com` oder `example.com` verwenden, aber nicht `app.example.com` oder `api.login.example.com`. Wählst du von Anfang an die übergeordnete Domain, können alle Subdomains Passkeys gemeinsam nutzen.
Eine andere Domain ohne Eintrag in .well-known/webauthn
gelegentlichSoll eine RP-ID über verschiedene Domains hinweg gelten (Länder-TLDs, Markenwechsel), muss die Domain der RP-ID die anderen Origins in `/.well-known/webauthn` aufführen. Fehlt diese Liste oder ist die Datei nicht erreichbar, wird die Anfrage abgelehnt.
Aufruf der Website über eine IP-Adresse
gelegentlichIP-Adressen sind keine gültigen RP-IDs; WebAuthn braucht einen Domainnamen (`localhost` ist für die Entwicklung erlaubt).
So behebst du den Fehler
- 1.
RP-ID pro Umgebung konfigurieren
Halte RP-ID und erwarteten Origin gemeinsam in der Umgebungskonfiguration, damit Entwicklung, Preview und Produktion jeweils ihren eigenen Host verwenden – und denk daran, dass Passkeys nicht zwischen RP-IDs umziehen.
js // Server: derive the RP ID from configuration per environment, never hard-code production. const rpID = process.env.WEBAUTHN_RP_ID; // "localhost" in dev, "example.com" in production const expectedOrigin = process.env.WEBAUTHN_ORIGIN; // "http://localhost:3000" / "https://app.example.com" const options = await generateRegistrationOptions({ rpName: "Example", rpID, userName }); - 2.
Related Origins bewusst veröffentlichen
Müssen mehrere deiner Domains Passkeys gemeinsam nutzen, liefere auf der Domain der RP-ID die Datei `/.well-known/webauthn` aus, in der diese Domains aufgeführt sind (unterstützt von aktuellen Versionen von Chromium und Safari).
json // https://example.com/.well-known/webauthn (served as application/json) { "origins": ["https://example.co.uk", "https://example-shop.com"] }
Verwandte Fehler
NotAllowedError: The operation either timed out or was not allowed. See: https:…WebAuthn navigator.credentials.get() / create()Unexpected registration response origin "http://localhost:3000", expected "http…SimpleWebAuthn (@simplewebauthn/server)TypeError: Cannot read properties of undefined (reading 'digest')WebCrypto