Mensagem de erro
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.
Também aparece como
- SecurityError: The relying party ID is not a registrable domain suffix of, nor equal to the current domain.
Versões do Chromium sem suporte a Related Origin Requests terminam a frase em “…nor equal to the current domain.”. Outros navegadores usam outra redação; a parte estável é o nome da DOMException, `SecurityError`.
WebAuthn navigator.credentials.create() / get() — DOMException SecurityError (Chromium)
O que significa
O RP ID das suas opções não é o nome de host da própria página nem um domínio pai registrável dele, então o navegador se recusou a criar ou usar uma credencial para esse RP ID. Uma chave de acesso (passkey) fica vinculada ao próprio RP ID; se qualquer página pudesse declarar qualquer RP ID, um site conseguiria usar as chaves de acesso de outro. O Chromium também tentou o mecanismo Related Origin Requests do WebAuthn (buscando `https://<rp-id>/.well-known/webauthn` para ver se o RP ID lista sua origem), e esse mecanismo também não autorizou a requisição.
Por que acontece
RP ID de produção em um host de desenvolvimento ou de preview
comum`rp.id: "app.example.com"` enviado a uma página em `localhost`, em uma URL de deploy de preview (`*.vercel.app`, `*.netlify.app`) ou em um domínio de homologação. O RP ID precisa corresponder ao ambiente que serve a página.
Um domínio irmão ou filho como RP ID
comumUma página em `login.example.com` pode usar `login.example.com` ou `example.com`, mas não `app.example.com` nem `api.login.example.com`. Escolher o domínio pai desde o início permite que todos os subdomínios compartilhem chaves de acesso.
Outro domínio sem uma entrada em .well-known/webauthn
ocasionalUsar um único RP ID em domínios diferentes (TLDs de país, mudanças de marca) exige que o domínio do RP ID liste as outras origens em `/.well-known/webauthn`. Sem isso, ou se o arquivo estiver inacessível, a requisição é recusada.
Abrir o site pelo endereço IP
ocasionalEndereços IP não são RP IDs válidos; o WebAuthn precisa de um nome de domínio (`localhost` é permitido para desenvolvimento).
Como corrigir
- 1.
Configurar o RP ID por ambiente
Mantenha o RP ID e a origem esperada juntos na configuração do ambiente, para que desenvolvimento, preview e produção usem cada um o próprio host — e lembre-se de que as chaves de acesso não migram entre RP IDs.
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 as origens relacionadas de forma deliberada
Se vários dos seus domínios precisam compartilhar chaves de acesso, sirva no domínio do RP ID um `/.well-known/webauthn` que os liste (compatível com as versões atuais do Chromium e do Safari).
json // https://example.com/.well-known/webauthn (served as application/json) { "origins": ["https://example.co.uk", "https://example-shop.com"] }
Erros 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