Подробный разбор немедленной медиации WebAuthn. Рассказываем, как с ее помощью создать единую кнопку входа, избежать путаницы с QR-кодами и построить более умный процесс аутентификации.
Vincent
Created: August 8, 2025
Updated: August 13, 2025
See the original blog version in English here.
60-page Enterprise Passkey Whitepaper:
Learn how leaders get +80% passkey adoption. Trusted by Rakuten, Klarna & Oracle
Переход на passkeys создает «парадокс passkeys»: у некоторых пользователей уже есть passkeys, в то время как многие по-прежнему используют традиционные пароли. Это приводит к загромождению экранов входа множеством кнопок: «Войти с паролем», «Войти через Google» и «Войти с помощью passkey». Такая фрагментация создает неудобства. Пользователь может нажать «Войти с помощью passkey» на новом устройстве и столкнуться с непонятным запросом QR-кода, потому что его passkey недоступен локально. Основная проблема заключается в том, что сайт не может узнать контекст пользователя до начала процесса аутентификации.
Одно из решений — это подход с идентификатором в первую очередь, который определяет лучший метод входа для пользователя. Другое потенциальное решение — единая интеллектуальная кнопка «Войти», которая организует наиболее плавный процесс для каждого пользователя. Она должна напрямую запрашивать passkey, если он доступен на устройстве, или плавно переключаться на другие методы, если нет.
Была анонсирована новая функция WebAuthn, которая может сделать это возможным: немедленная
медиация (mediation: 'immediate'
). Устанавливая это свойство в вызове WebAuthn API,
разработчики могут создать интеллектуальный, унифицированный опыт входа, который решает
парадокс passkeys. В этой статье мы проведем ориентированный на разработчиков анализ
mediation: 'immediate'
, исследуя, что это такое, как это работает и как это реализовать.
Recent Articles
📖
WebAuthn pubKeyCredParams и credentialPublicKey: CBOR и COSE
📖
Протокол обмена учетными данными (CXP) и формат обмена (CXF)
🔑
Passkeys и WebAuthn PRF для сквозного шифрования (2025)
📖
Подсказки WebAuthn для учетных данных с открытым ключом / User-Agent
📖
WebAuthn Signal API: Обновление и удаление Passkeys на стороне клиента
Чтобы понять немедленную медиацию, полезно сначала узнать о других вариантах. Медиация пользователя в WebAuthn — это то, как браузер управляет взаимодействием между вашим сайтом (доверяющей стороной) и аутентификатором пользователя (например, Face ID, YubiKey).
Это классический, явный процесс WebAuthn. Когда
доверяющая сторона вызывает
navigator.credentials.get()
, не указывая предпочтения mediation
, браузер всегда
показывает модальное диалоговое окно. Это окно перекрывает содержимое страницы, требуя
немедленного внимания пользователя и приостанавливая любое другое взаимодействие с сайтом.
mediation: 'conditional'
#Этот режим, введенный для помощи пользователям в
переходе на passkeys, является более
тонким. При mediation: 'conditional'
запрос WebAuthn привязывается к полю ввода
(например, имени пользователя) с атрибутом autocomplete="webauthn"
. Когда пользователь
нажимает на поле, интерфейс автозаполнения браузера предлагает все доступные passkeys.
mediation: 'immediate'
— это решение проблемы «единой кнопки входа». Она предоставляет
сайту надежный способ проверить наличие passkey перед отображением какого-либо интерфейса.
Вместо того чтобы приказывать пользователю аутентифицироваться с помощью passkey через модальное окно, немедленная медиация спрашивает браузер: «Есть ли готовый к использованию passkey для этого пользователя на этом устройстве прямо сейчас?»
Важно отметить, что этот запрос проверяет только локально доступные учетные данные (например, встроенные в устройство аутентификаторы, такие как Windows Hello, или passkeys, синхронизированные через менеджер паролей). Он разработан так, чтобы избегать запуска процесса с QR-кодом для другого устройства, который является частым источником проблем.
Сила этой функции заключается в ее четком, бинарном результате. Промис, возвращаемый
navigator.credentials.get()
, либо выполнится успешно, либо завершится с ошибкой, давая
разработчику ясный сигнал.
PublicKeyCredential
.navigator.credentials.get()
немедленно отклоняется с DOMException
под названием
NotAllowedError
.NotAllowedError
— это не ошибка, а скорее особенность. Это надежный, мгновенный сигнал о
том, что сайту следует перейти к резервному методу аутентификации. Это позволяет
разработчикам использовать простой блок try...catch
: блок try
пытается выполнить
плавный процесс с passkey, а блок catch
отлавливает NotAllowedError
, чтобы отобразить
традиционную форму входа. Это элегантно решает проблему единой кнопки входа, создавая одну
точку входа, которая интеллектуально адаптируется к контексту пользователя.
Выбор правильного режима медиации — это критически важное решение для UX. В этой таблице представлено их сравнение.
Характеристика / Поведение | Модальная (по умолчанию) | Условный UI (conditional ) | Немедленная (immediate ) |
---|---|---|---|
Вызов API | navigator.credentials.get() | navigator.credentials.get({ mediation: 'conditional' }) | navigator.credentials.get({ mediation: 'immediate' }) |
Триггер | Явное действие пользователя (например, клик по кнопке) | Загрузка страницы; UI при фокусе на поле ввода | Явное действие пользователя (например, клик по кнопке) |
Отображение UI | Всегда немедленно показывает модальное окно. | Показывает немодальный UI в стиле автозаполнения. | Только если найден локальный ключ, показывает модальное окно. |
Поведение при отсутствии локального ключа | Показывает UI для процессов на других устройствах (например, QR-код). | Промис остается в ожидании, никогда не разрешается, ошибка не выбрасывается. | Промис немедленно отклоняется с NotAllowedError . |
Что узнает сайт | Ничего, пока пользователь не завершит процесс. | Ничего, если пользователь не взаимодействует. Максимальная конфиденциальность. | Узнает один бит информации: существует ли локальный ключ. |
Основной сценарий использования | Отдельная кнопка «Войти с помощью passkey». Явная двухфакторная аутентификация. | Унифицированные формы входа/регистрации. Постепенное улучшение форм с паролями. | Единая основная кнопка «Войти» для смешанной базы пользователей. |
Действия разработчика | Обработать успех или отмену пользователем. | Обработать успех. Нет сигнала о неудаче для реакции. | Обработать успех или NotAllowedError для запуска резервного UI. |
Вот практическое пошаговое руководство по реализации mediation: 'immediate'
.
Поскольку mediation: 'immediate'
— это новая функция, надежное определение ее поддержки
имеет решающее значение.
// Feature detection is essential for progressive enhancement. let immediateMediationAvailable = false; if (window.PublicKeyCredential && PublicKeyCredential.getClientCapabilities) { try { const capabilities = await PublicKeyCredential.getClientCapabilities(); // The 'immediateGet' capability signals browser support. immediateMediationAvailable = capabilities.immediateGet === true; } catch (e) { console.error("Error getting client capabilities:", e); } }
navigator.credentials.get()
#Этот вызов должен быть инициирован действием пользователя, например, кликом по кнопке.
// This function should be the event handler for your primary "Sign In" button. async function handleSignInClick() { if (!immediateMediationAvailable) { // Fall back to showing a legacy login form if the feature isn't supported. showLegacyLoginForm(); return; } try { // Fetch a fresh, random challenge from your server for each attempt. const challenge = await fetchChallengeFromServer(); const publicKeyCredentialRequestOptions = { challenge: challenge, // The server-provided challenge as a Uint8Array rpId: "example.com", // The allowCredentials list MUST be empty for immediate mediation // to protect user privacy. allowCredentials: [], }; const credential = await navigator.credentials.get({ publicKey: publicKeyCredentialRequestOptions, // This is the key that enables the immediate mediation flow. mediation: "immediate", }); // If the promise resolves, send the credential to your server for verification. await verifyCredentialOnServer(credential); } catch (error) { // The catch block is a critical part of the control flow. handleAuthError(error); } }
NotAllowedError
для плавного перехода#Блок catch
— это место, где реализуется «интеллект» единой кнопки входа.
// Handling the NotAllowedError is the key to the fallback mechanism. function handleAuthError(error) { // Check the 'name' property of the DOMException. if (error.name === "NotAllowedError") { // This is the expected signal to show the traditional login form. console.log("No local passkey found. Showing legacy login form."); showLegacyLoginForm(); } else { // This handles other potential errors, like the user dismissing the prompt. console.error("Authentication error:", error); } }
Для наиболее плавного опыта вы можете попросить браузер искать как passkeys, так и
сохраненные пароли в одном запросе, добавив password: true
.
// Combining passkeys and passwords for a truly unified sign-in experience. const credential = await navigator.credentials.get({ publicKey: publicKeyCredentialRequestOptions, password: true, // Ask the browser to include saved passwords. mediation: "immediate", }); // The returned 'credential' object will either be a PublicKeyCredential // or a PasswordCredential. Your server-side logic must handle both.
conditional
запрос (часто запускаемый
при загрузке страницы) может заблокировать новый immediate
запрос. Рассмотрите
возможность использования AbortController
для отмены любых ожидающих запросов перед
запуском нового.allowCredentials
: Массив allowCredentials
должен быть
пустым. Предоставление идентификаторов учетных данных приведет к сбою вызова. Это
важная мера защиты конфиденциальности, чтобы предотвратить проверку сайтами наличия
конкретных, известных пользователей.mediation: 'immediate'
была разработана с четким пониманием компромиссов в области
безопасности и конфиденциальности.
Основной компромисс — это «утечка одного бита». Отслеживая время разрешения промиса, доверяющая сторона может сделать вывод об одном бите информации: был ли промис отклонен мгновенно (нет локального ключа) или была задержка (был показан UI, потому что найден локальный ключ). Цель этой утечки — обеспечить лучший UX.
Разработчики предвидели возможность злоупотреблений (например, отслеживание пользователей) и встроили несколько обязательных мер защиты:
allowCredentials
: Массив allowCredentials
должен
быть пустым. Это не позволяет сайту использовать эту функцию для проверки, посещает ли
его конкретный известный пользователь.iframe
с другого домена), чтобы предотвратить межсайтовое отслеживание.Эти меры гарантируют, что основные гарантии безопасности WebAuthn остаются неизменными. Сама церемония аутентификации не меняется и остается устойчивой к фишингу.
mediation: 'immediate'
— это продвинутая функция из
спецификации WebAuthn Level 3, и ее внедрение
продолжается. По состоянию на середину 2025 года стратегия постепенного улучшения является
необходимой.
Браузер | Статус | Примечания и источник |
---|---|---|
Chrome | Тестовая версия для разработчиков | Доступно через флаг experimental-web-platform-features . Трекер ошибки. |
Edge | В разработке (ожидается) | Как браузер на основе Chromium, поддержка должна появиться после Chrome. |
Safari (WebKit) | На рассмотрении | Позиции WebKit по стандартам. Публичных обязательств нет. |
Firefox (Gecko) | На рассмотрении | Позиции Mozilla по стандартам. Публичных обязательств нет. |
Хотя mediation: 'immediate'
предоставляет отличный низкоуровневый инструмент для
создания более умной кнопки входа, важно отличать его от более широкого решения
«Passkey Intelligence»,
такого как то, что предлагает Corbado. Оба нацелены на решение парадокса passkeys и
увеличение их внедрения, но делают это по-разному.
Характеристика | mediation: 'immediate' | Passkey Intelligence (например, Corbado) |
---|---|---|
Как это работает | Нативный вызов API браузера, который проверяет наличие локально доступных passkeys на текущем устройстве. | Бэкенд-сервис, который собирает и анализирует данные об устройствах пользователя, аутентификаторах и истории входов между сессиями. |
Предоставляемый сигнал | Простой, бинарный сигнал: локальный passkey либо существует (UI prompt ), либо нет (NotAllowedError ). | Богатая, контекстуальная информация, например: «Этот пользователь только что вошел с паролем на устройстве, поддерживающем passkeys, которое он часто использует». |
Ключевое преимущество | Очень быстрая, нативная проверка с минимальной сетевой нагрузкой. | Универсальная доступность, независимо от поддержки браузером/ОС новых функций WebAuthn. Более глубокие инсайты для более персонализированного UX. |
Основная зависимость | Требует актуальной поддержки со стороны браузера и ОС, которая пока не является универсальной. | Интеграция с бэкенд-сервисом. |
Passkey Intelligence идет на шаг дальше, собирая и оценивая данные с течением времени. Это позволяет осуществлять более сложные и своевременные вмешательства. Например, бэкенд Passkey Intelligence может обнаружить:
Этот подход, основанный на данных, не зависит от поддержки браузером
mediation: 'immediate'
, что означает, что он может обеспечить более интеллектуальный
процесс входа для всех ваших пользователей прямо сейчас.
Лучшее из двух миров
В конечном счете, эти два подхода не являются взаимоисключающими; они дополняют друг друга. Идеальное решение сочетает их:
mediation: 'immediate'
в качестве одного из своих
сигналов в поддерживаемых браузерах для выполнения быстрой первоначальной проверки.Сочетая нативную скорость mediation: 'immediate'
с глубокими инсайтами бэкенда
Passkey Intelligence,
вы можете обеспечить максимально плавный, адаптивный и эффективный опыт входа, мягко
направляя каждого пользователя к будущему без паролей.
Немедленная медиация — это отличное улучшение опыта входа. Она предоставляет интеллект, необходимый для устранения распространенных источников трения и путаницы для пользователей во время перехода на passkeys.
immediate
медиация снимает когнитивную нагрузку с пользователя. Ему больше не нужно
помнить, какой метод аутентификации он настроил, или выбирать из загроможденного списка
опций. Процесс входа становится проще и интуитивнее.mediation: 'immediate'
ищет только локальные учетные данные, она полностью избегает
этой запутанной ситуации. Вместо того чтобы пользователь прерывал процесс, приложение
получает четкий сигнал (NotAllowedError
) для плавного перехода к другому методу, что
приводит к более гладкому пути.Немедленная медиация — это новая функция WebAuthn, которая решает проблему фрагментированного опыта входа в период перехода на passkeys. Она позволяет создать единую, интеллектуальную кнопку «Войти», которая адаптируется к контексту пользователя, устраняя путаницу и трение. Хотя она вводит просчитанный компромисс в отношении конфиденциальности, она включает надежные меры защиты для снижения рисков без ущерба для основной безопасности WebAuthn.
Для разработчиков путь вперед — это постепенное улучшение. Создайте надежный базовый опыт
и добавляйте immediate
медиацию поверх него для поддерживаемых браузеров. Внедрение этой
функции — это стратегический шаг для ускорения
внедрения passkeys, повышения безопасности,
снижения операционных расходов и улучшения конверсии.
Реализация этих передовых потоков аутентификации может быть сложной. Платформа Enterprise
Passkey от Corbado абстрагирует эту сложность. Наша
инфраструктура управляет оптимальной оркестрацией
потоков, включая условную и immediate
медиацию, что позволяет вашей команде с
уверенностью развернуть современный, бесшовный опыт аутентификации.
Enjoyed this read?
🤝 Join our Passkeys Community
Share passkeys implementation tips and get support to free the world from passwords.
🚀 Subscribe to Substack
Get the latest news, strategies, and insights about passkeys sent straight to your inbox.
Related Articles
Table of Contents