Перейти к содержимому
ecdsa.com
WebAuthn navigator.credentials.get() / create()WebAuthn и ключи доступа

Сообщение об ошибке

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: браузер выдаёт её в самых разных ситуациях. Спецификация намеренно делает случаи «пользователь отменил операцию», «истёк тайм-аут», «ни на одном аутентификаторе нет подходящих учётных данных» и «запрос в этом контексте не разрешён» неразличимыми для веб-страницы, чтобы сайт не мог выяснить, какие учётные данные есть на устройстве (почему это важно, объясняет раздел о конфиденциальности, на который ведёт ссылка). Поэтому ваш код должен трактовать эту ошибку как «учётные данные не получены» и предлагать другой путь; настоящую причину находят, воспроизводя проблему, а не читая текст ошибки.

Почему это происходит

Как исправить

  1. 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. 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)
    ],

Связанные ошибки

Открыть всю базу ошибок подписей