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

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

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.

Также выводится как

  • SecurityError: The relying party ID is not a registrable domain suffix of, nor equal to the current domain.

Версии Chromium без поддержки Related Origin Requests заканчивают сообщение на «…nor equal to the current domain.». Другие браузеры формулируют ошибку иначе; неизменным остаётся только имя DOMException — `SecurityError`.

WebAuthn navigator.credentials.create() / get() — DOMException SecurityError (Chromium)

Что это означает

RP ID в ваших параметрах не совпадает с именем хоста страницы и не входит в число его регистрируемых родительских доменов, поэтому браузер отказался создавать или использовать для него учётные данные. Ключ доступа привязан к своему RP ID; если бы любая страница могла заявить любой RP ID, один сайт мог бы пользоваться ключами доступа другого. Chromium также попробовал механизм WebAuthn Related Origin Requests (запросил `https://<rp-id>/.well-known/webauthn`, чтобы проверить, указан ли ваш источник в списке для этого RP ID), но и этот механизм не разрешил запрос.

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

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

  1. 1.

    Настройте RP ID для каждого окружения

    Храните RP ID и ожидаемый источник вместе в конфигурации окружения, чтобы у разработки, превью и продакшена были отдельные хосты, — и помните, что ключи доступа не переносятся между разными RP ID.

    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. 2.

    Публикуйте связанные источники осознанно

    Если несколько ваших доменов должны использовать общие ключи доступа, отдавайте на домене RP ID файл `/.well-known/webauthn` со списком этих доменов (это поддерживают текущие версии Chromium и Safari).

    json
    // https://example.com/.well-known/webauthn  (served as application/json)
    {
      "origins": ["https://example.co.uk", "https://example-shop.com"]
    }

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

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