Mensagem de erro
NotAllowedError: The operation either timed out or was not allowed. See: https://www.w3.org/TR/webauthn-2/#sctn-privacy-considerations-client.
Também aparece como
- NotAllowedError: The operation either timed out or was not allowed.
- NotAllowedError: CredentialsContainer request is not allowed.
O texto acima é o do Chromium (versões mais antigas omitem o link “See: …”). O Firefox diz “CredentialsContainer request is not allowed.” (reproduzido no Firefox 157 headless, que não tem autenticador). A mensagem varia de navegador para navegador; só `e.name` é estável.
WebAuthn navigator.credentials.get() / create() — DOMException NotAllowedError (Chromium; Firefox wording in aliases)
O que significa
A falha genérica do WebAuthn no navegador. A especificação torna, de propósito, indistinguíveis para a página web os casos “o usuário cancelou”, “o tempo limite expirou”, “nenhum autenticador tem uma credencial correspondente” e “a requisição não foi permitida neste contexto”, para que um site não consiga sondar quais credenciais existem em um dispositivo (a seção sobre privacidade indicada no link explica o motivo). Por isso, seu código precisa tratar o erro como “nenhuma credencial foi produzida” e oferecer outro caminho; a causa real se descobre reproduzindo o problema, não lendo o erro.
Por que acontece
Nenhuma credencial de allowCredentials neste autenticador
comumA chave de acesso (passkey) da conta está em outro dispositivo, foi excluída ou foi registrada com outro RP ID. O navegador espera por um autenticador correspondente até o tempo limite e então informa NotAllowedError.
O usuário fechou a caixa de diálogo ou o tempo limite expirou
comumFechar o painel de chaves de acesso do navegador, falhar na verificação biométrica vezes demais ou um `timeout` curto em um fluxo lento com chave de segurança — tudo isso termina do mesmo jeito.
Chamada sem gesto do usuário ou a partir de uma página oculta
ocasionalO Safari, em particular, exige que `create()`/`get()` rodem em resposta a um clique; chamadas feitas depois de um `await` em uma requisição de rede lenta podem perder a ativação do usuário. Abas em segundo plano e iframes de outra origem sem as permissões `publickey-credentials-*` também falham.
Nenhum algoritmo compatível em pubKeyCredParams
ocasionalSe o autenticador não for compatível com nenhum dos algoritmos COSE que você lista, o registro falha com NotAllowedError, e não com um erro específico.
Como corrigir
- 1.
Tratar como “nenhuma credencial” e oferecer alternativas
Não mostre um erro assustador. Ofereça outro método de login, outro dispositivo (fluxo híbrido/QR) ou o registro de uma nova chave de acesso.
js try { const credential = await navigator.credentials.get({ publicKey: options }); await finishLogin(credential); } catch (e) { if (e.name === "NotAllowedError") { // Cancelled, timed out, or no passkey for this account on this device: offer alternatives. showOtherSignInOptions(); } else { throw e; } } - 2.
Oferecer algoritmos comuns no registro
Listar ES256, EdDSA e RS256 cobre praticamente todos os autenticadores; nesse caso, seu servidor precisa verificar os três.
js // Registration: offer the algorithms authenticators actually support. pubKeyCredParams: [ { type: "public-key", alg: -7 }, // ES256 { type: "public-key", alg: -8 }, // EdDSA (Ed25519) { type: "public-key", alg: -257 }, // RS256 (Windows Hello and older security keys) ],
Erros relacionados
SecurityError: The relying party ID is not a registrable domain suffix of, nor…WebAuthn navigator.credentials.create() / get()InvalidStateError: The user attempted to register an authenticator that contain…WebAuthn navigator.credentials.create() with excludeCredentialsUnexpected registration response origin "http://localhost:3000", expected "http…SimpleWebAuthn (@simplewebauthn/server)