Mensaje de error
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.
También se muestra como
- SecurityError: The relying party ID is not a registrable domain suffix of, nor equal to the current domain.
Las versiones de Chromium que no admiten Related Origin Requests terminan la frase después de «…nor equal to the current domain.». Otros navegadores lo formulan de otra manera; el nombre de la DOMException, `SecurityError`, es la parte estable.
WebAuthn navigator.credentials.create() / get() — DOMException SecurityError (Chromium)
Qué significa
El RP ID de tus opciones no es el nombre de host de la página ni un dominio padre registrable de él, así que el navegador se negó a crear o usar una credencial con ese RP ID. Una llave de acceso está vinculada a su RP ID; si cualquier página pudiera atribuirse cualquier RP ID, un sitio podría usar las llaves de acceso de otro. Chromium también probó el mecanismo Related Origin Requests de WebAuthn (descargar `https://<rp-id>/.well-known/webauthn` para ver si el RP ID incluye tu origen en su lista), y tampoco así se autorizó la solicitud.
Por qué ocurre
RP ID de producción en un host de desarrollo o de vista previa
frecuente`rp.id: "app.example.com"` enviado a una página en `localhost`, en la URL de un despliegue de vista previa (`*.vercel.app`, `*.netlify.app`) o en un dominio de preproducción. El RP ID debe corresponder al entorno desde el que se sirve la página.
Un dominio hermano o hijo como RP ID
frecuenteUna página en `login.example.com` puede usar `login.example.com` o `example.com`, pero no `app.example.com` ni `api.login.example.com`. Elegir el dominio padre desde el principio permite que todos los subdominios compartan llaves de acceso.
Otro dominio sin una entrada en .well-known/webauthn
ocasionalUsar un mismo RP ID en dominios distintos (TLD de país, cambios de marca) exige que el dominio del RP ID enumere los demás orígenes en `/.well-known/webauthn`. Sin esa lista, o si el archivo es inaccesible, la solicitud se rechaza.
Abrir el sitio por dirección IP
ocasionalLas direcciones IP no son RP ID válidos; WebAuthn necesita un nombre de dominio (`localhost` se permite para desarrollo).
Cómo solucionarlo
- 1.
Configurar el RP ID para cada entorno
Guarda el RP ID y el origen esperado juntos en la configuración de cada entorno, para que desarrollo, vista previa y producción usen cada uno su propio host, y recuerda que las llaves de acceso no pasan de un RP ID a otro.
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.
Publicar los orígenes relacionados de forma deliberada
Si varios de tus dominios deben compartir llaves de acceso, sirve en el dominio del RP ID un `/.well-known/webauthn` que los enumere (compatible con las versiones actuales de Chromium y Safari).
json // https://example.com/.well-known/webauthn (served as application/json) { "origins": ["https://example.co.uk", "https://example-shop.com"] }
Errores relacionados
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