Message d’erreur
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.
Également affiché sous la forme
- SecurityError: The relying party ID is not a registrable domain suffix of, nor equal to the current domain.
Les versions de Chromium sans prise en charge de Related Origin Requests terminent la phrase après « …nor equal to the current domain. ». Les autres navigateurs la formulent différemment ; le nom de la DOMException, `SecurityError`, est la partie stable.
WebAuthn navigator.credentials.create() / get() — DOMException SecurityError (Chromium)
Ce que cela signifie
L’ID de la partie de confiance (RP ID) indiqué dans vos options n’est ni le nom d’hôte de la page, ni un domaine parent enregistrable de celui-ci : le navigateur a donc refusé de créer ou d’utiliser un identifiant pour ce RP ID. Une clé d’accès est liée à son RP ID ; si n’importe quelle page pouvait revendiquer n’importe quel RP ID, un site pourrait utiliser les clés d’accès d’un autre. Chromium a aussi essayé le mécanisme WebAuthn Related Origin Requests (récupérer `https://<rp-id>/.well-known/webauthn` pour voir si le RP ID liste votre origine), et ce mécanisme n’a pas non plus autorisé la requête.
Pourquoi cela se produit
RP ID de production sur un hôte de développement ou de prévisualisation
fréquente`rp.id: "app.example.com"` envoyé à une page sur `localhost`, sur l’URL d’un déploiement de prévisualisation (`*.vercel.app`, `*.netlify.app`) ou sur un domaine de préproduction. Le RP ID doit correspondre à l’environnement depuis lequel la page est servie.
Un domaine frère ou enfant comme RP ID
fréquenteUne page sur `login.example.com` peut utiliser `login.example.com` ou `example.com`, mais pas `app.example.com` ni `api.login.example.com`. Choisir le domaine parent dès le départ permet à tous les sous-domaines de partager les clés d’accès.
Un autre domaine sans entrée .well-known/webauthn
occasionnelleUtiliser un même RP ID sur plusieurs domaines (TLD nationaux, changements de marque) exige que le domaine du RP ID liste les autres origines dans `/.well-known/webauthn`. Sans cette liste, ou si le fichier est inaccessible, la requête est refusée.
Ouvrir le site par son adresse IP
occasionnelleLes adresses IP ne sont pas des RP ID valides ; WebAuthn exige un nom de domaine (`localhost` est autorisé pour le développement).
Comment corriger l’erreur
- 1.
Configurer le RP ID par environnement
Conservez le RP ID et l’origine attendue ensemble dans la configuration de l’environnement, afin que le développement, la prévisualisation et la production utilisent chacun leur propre hôte. Et n’oubliez pas que les clés d’accès ne passent pas d’un RP ID à un autre.
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.
Publier délibérément les origines associées
Si plusieurs de vos domaines doivent partager des clés d’accès, servez sur le domaine du RP ID un fichier `/.well-known/webauthn` qui les liste (pris en charge par les versions actuelles de Chromium et de Safari).
json // https://example.com/.well-known/webauthn (served as application/json) { "origins": ["https://example.co.uk", "https://example-shop.com"] }
Erreurs associées
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