Сообщение об ошибке
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), но и этот механизм не разрешил запрос.
Почему это происходит
RP ID продакшена на хосте разработки или превью
частоПараметр `rp.id: "app.example.com"` отправлен странице на `localhost`, по URL превью-развёртывания (`*.vercel.app`, `*.netlify.app`) или на staging-домене. RP ID должен соответствовать окружению, из которого отдаётся страница.
Соседний или дочерний домен в качестве RP ID
частоСтраница на `login.example.com` может использовать `login.example.com` или `example.com`, но не `app.example.com` и не `api.login.example.com`. Если сразу выбрать родительский домен, ключи доступа будут общими для всех поддоменов.
Другой домен без записи в .well-known/webauthn
иногдаЧтобы использовать один RP ID на разных доменах (национальные домены верхнего уровня, домены после ребрендинга), домен RP ID должен перечислить остальные источники в `/.well-known/webauthn`. Если такого списка нет или файл недоступен, запрос отклоняется.
Сайт открыт по IP-адресу
иногдаIP-адрес не может быть RP ID: WebAuthn нужно доменное имя (для разработки допускается `localhost`).
Как исправить
- 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.
Публикуйте связанные источники осознанно
Если несколько ваших доменов должны использовать общие ключи доступа, отдавайте на домене 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"] }
Связанные ошибки
NotAllowedError: The operation either timed out or was not allowed. See: https:…WebAuthn navigator.credentials.get() / create()Unexpected registration response origin "http://localhost:3000", expected "http…SimpleWebAuthn (@simplewebauthn/server)TypeError: Cannot read properties of undefined (reading 'digest')WebCrypto