Сообщение об ошибке
NotAllowedError: The operation either timed out or was not allowed. See: https://www.w3.org/TR/webauthn-2/#sctn-privacy-considerations-client.
Также выводится как
- NotAllowedError: The operation either timed out or was not allowed.
- NotAllowedError: CredentialsContainer request is not allowed.
Выше приведён текст Chromium (в старых версиях нет ссылки «See: …»). Firefox пишет «CredentialsContainer request is not allowed.» (воспроизведено в Firefox 157 в headless-режиме, где нет аутентификатора). Сообщение зависит от браузера; неизменно только `e.name`.
WebAuthn navigator.credentials.get() / create() — DOMException NotAllowedError (Chromium; Firefox wording in aliases)
Что это означает
Универсальная ошибка WebAuthn: браузер выдаёт её в самых разных ситуациях. Спецификация намеренно делает случаи «пользователь отменил операцию», «истёк тайм-аут», «ни на одном аутентификаторе нет подходящих учётных данных» и «запрос в этом контексте не разрешён» неразличимыми для веб-страницы, чтобы сайт не мог выяснить, какие учётные данные есть на устройстве (почему это важно, объясняет раздел о конфиденциальности, на который ведёт ссылка). Поэтому ваш код должен трактовать эту ошибку как «учётные данные не получены» и предлагать другой путь; настоящую причину находят, воспроизводя проблему, а не читая текст ошибки.
Почему это происходит
На аутентификаторе нет учётных данных из allowCredentials
частоКлюч доступа этого аккаунта хранится на другом устройстве, удалён или зарегистрирован с другим RP ID. Браузер ждёт подходящий аутентификатор до истечения тайм-аута, а затем выдаёт NotAllowedError.
Пользователь закрыл диалог, или истёк тайм-аут
частоПользователь закрыл окно ключей доступа в браузере, слишком часто не проходил биометрическую проверку или `timeout` оказался слишком коротким для медленной работы с ключом безопасности — всё это заканчивается одинаково.
Вызов без действия пользователя или со скрытой страницы
иногдаВ частности, Safari требует, чтобы `create()`/`get()` выполнялись в ответ на щелчок; вызов, сделанный после `await` медленного сетевого запроса, может утратить пользовательскую активацию. Ошибку дают также фоновые вкладки и iframe из других источников без разрешений `publickey-credentials-*`.
В pubKeyCredParams нет поддерживаемого алгоритма
иногдаЕсли аутентификатор не поддерживает ни одного из перечисленных вами алгоритмов COSE, регистрация завершается ошибкой NotAllowedError, а не более конкретной ошибкой.
Как исправить
- 1.
Обрабатывайте ошибку как «учётных данных нет» и предлагайте альтернативы
Не показывайте пугающее сообщение об ошибке. Предложите другой способ входа, другое устройство (гибридный сценарий с QR-кодом) или регистрацию нового ключа доступа.
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.
Предлагайте при регистрации распространённые алгоритмы
Список из ES256, EdDSA и RS256 охватывает практически все аутентификаторы; тогда ваш сервер должен проверять подписи всех трёх алгоритмов.
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) ],
Связанные ошибки
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)