Mensaje de error
NotAllowedError: The operation either timed out or was not allowed. See: https://www.w3.org/TR/webauthn-2/#sctn-privacy-considerations-client.
También se muestra como
- NotAllowedError: The operation either timed out or was not allowed.
- NotAllowedError: CredentialsContainer request is not allowed.
Arriba está el texto de Chromium (las versiones antiguas omiten el enlace «See: …»). Firefox dice «CredentialsContainer request is not allowed.» (reproducido en Firefox 157 en modo headless, que no tiene autenticador). El mensaje cambia según el navegador; solo `e.name` es estable.
WebAuthn navigator.credentials.get() / create() — DOMException NotAllowedError (Chromium; Firefox wording in aliases)
Qué significa
El fallo genérico de WebAuthn del navegador, que lo engloba todo. La especificación hace deliberadamente que «el usuario canceló», «se agotó el tiempo de espera», «ningún autenticador tiene una credencial que coincida» y «la solicitud no estaba permitida en este contexto» sean indistinguibles para la página web, de modo que un sitio no pueda sondear qué credenciales existen en un dispositivo (la sección de privacidad enlazada explica por qué). Por eso tu código tiene que tratarlo como «no se produjo ninguna credencial» y ofrecer otra vía; la causa real se encuentra reproduciéndolo, no leyendo el error.
Por qué ocurre
Ninguna credencial de allowCredentials en este autenticador
frecuenteLa llave de acceso de la cuenta está en otro dispositivo, se eliminó o se registró con otro RP ID. El navegador espera un autenticador que coincida hasta que se agota el tiempo de espera y entonces notifica NotAllowedError.
El usuario cerró el diálogo o se agotó el tiempo de espera
frecuenteCerrar el panel de llaves de acceso del navegador, fallar la verificación biométrica demasiadas veces o un `timeout` corto en un flujo lento con llave de seguridad: todo termina igual.
Llamada sin un gesto del usuario o desde una página oculta
ocasionalSafari, en particular, exige que `create()`/`get()` se ejecuten en respuesta a un clic; las llamadas posteriores a un `await` sobre una solicitud de red lenta pueden perder la activación. Las pestañas en segundo plano y los iframes de origen cruzado sin los permisos `publickey-credentials-*` también fallan.
Ningún algoritmo compatible en pubKeyCredParams
ocasionalSi el autenticador no admite ninguno de los algoritmos COSE que enumeras, el registro falla con NotAllowedError en lugar de con un error específico.
Cómo solucionarlo
- 1.
Tratarlo como «sin credencial» y ofrecer alternativas
No muestres un error alarmante. Ofrece otro método de inicio de sesión, otro dispositivo (flujo híbrido/QR) o el registro de una nueva llave de acceso.
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.
Ofrecer algoritmos comunes en el registro
Enumerar ES256, EdDSA y RS256 cubre prácticamente todos los autenticadores; después, tu servidor debe verificar los tres.
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) ],
Errores 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)