Помогите пользователям более легко применять ключи доступа

Опубликовано: 9 мая 2025 г.

Пароли обеспечивают надёжную аутентификацию, устойчивую к фишингу. Однако принуждение пользователей к их использованию может вызвать трудности. Автоматическое создание паролей позволяет создавать пароли для пользователей в нужный момент, если у них уже сохранён пароль для вашего сайта. Условное создание, которое обеспечивает автоматическое создание паролей, является частью спецификации WebAuthn.

Как это работает

Чтобы сделать использование ключей доступа более удобным для пользователей, используйте функцию API WebAuthn под названием «Условное создание» . Условное создание позволяет вашему сайту запрашивать ключ доступа для пользователя, не требуя от него никаких действий.

Этот поток работает при соблюдении следующих условий:

  • У пользователя имеется сохраненный пароль в менеджере паролей по умолчанию.
  • Пароль был использован недавно. В идеале следует вызывать Conditional Create сразу после успешного входа с паролем.

Если оба условия выполнены, вы можете запросить у менеджера паролей создание ключа доступа для пользователя, вызвав метод Conditional Create. После успешного создания ключа доступа пользователь получает уведомление, соответствующее выбранному менеджеру паролей.

Поток запроса ключа доступа с условным созданием.

Совместимость

Условное создание поддерживается Safari на macOS и всеми браузерами на iOS , а также Chrome на настольных компьютерах и Chrome на Android .

Реализовать условное создание

Автоматическое создание ключей доступа основано на функции API WebAuthn под названием Conditional Create . Это обычные запросы WebAuthn create() с параметром- mediation , установленным на "conditional" , что работает аналогично автозаполнению ключей доступа для запросов get() .

Используйте функцию «Условное создание» после входа пользователя с паролем. Успешность создания зависит от менеджера паролей и соблюдения определённых условий. Эти условия могут различаться в зависимости от менеджера паролей и со временем меняться. Например, в Chrome с менеджером паролей Google (GPM) пользователь должен недавно войти в систему, используя сохранённый пароль для сайта.

Если браузер успешно создаст ключ доступа, он вернет учётные данные открытого ключа. Отправьте эти данные в свой бэкенд , чтобы завершить регистрацию и включить будущую аутентификацию.

Обнаружение особенностей

Вы можете определить, доступно ли в браузере условное создание, вызвав метод PublicKeyCredential.getClientCapabilities() . Проверьте, содержит ли возвращаемый объект true для свойства conditionalCreate .

if (window.PublicKeyCredential && PublicKeyCredential.getClientCapabilities) {
  const capabilities = await PublicKeyCredential.getClientCapabilities();
  if (capabilities.conditionalCreate) {
    // Conditional create is available
  }
}

Если getClientCapabilities недоступен, то Conditional Create также недоступен.

Создайте условный ключ доступа

Чтобы выполнить автоматическое создание ключа доступа, вызовите navigator.credentials.create() , но с mediation: "conditional" вот так.

const cred = await navigator.credentials.create({
  publicKey: options,
  // Request conditional creation
  mediation: 'conditional'
});

Вам следует использовать автоматическое создание ключа доступа сразу после входа пользователя в систему, чтобы максимально повысить вероятность соответствия критериям менеджера паролей для автоматического создания.

Вы можете отправить полученные данные открытого ключа на сервер для проверки и регистрации ключа доступа . Убедитесь, что пользователь вошёл в систему на сервере.

Предостережения

Условное создание само по себе несложно реализовать, но есть несколько нюансов при фактической интеграции этой функции в существующую систему.

Игнорировать присутствие пользователя и его проверку на сервере

Ответ на регистрацию возвращает значения false для обоих флагов «User Presence» и «User Verified», поэтому сервер должен игнорировать эти флаги во время проверки учетных данных .

Отмените текущий вызов WebAuthn перед выполнением автоматического создания ключа доступа.

Если RP ожидает, что пользователь войдет в систему с помощью ключа доступа или пароля, наилучшим выбором будет выполнение условного get . Это может привести к отмене вызова условного get до выполнения условного create.

Для этого вам нужно использовать AbortController и вызвать .abort() .

// To abort a WebAuthn call, instantiate an AbortController.
const controller = new AbortController();

const cred = await navigator.credentials.get({
  publicKey: options,
  signal: controller.signal,
  // Request conditional get
  mediation: 'conditional'
});

// Abort the call
controller.abort();

Изящно игнорируйте исключения

При создании условного ключа доступа есть несколько случаев, исключения из которых следует игнорировать:

  • InvalidStateError : Ключ доступа уже существует у поставщика ключей доступа (не забудьте указать excludeCredentials ).
  • NotAllowedError : Создание ключа доступа не соответствует условию.
  • AbortError : вызов WebAuthn прерван.

Отображение ошибок в таких случаях может сбить пользователя с толку, поскольку браузер обрабатывает их молча: он показывает уведомление только в случае успеха, а сбои не вызывают видимых сообщений.

Сигнал при неудачной регистрации ключа доступа

Если ключ доступа создан, но не зарегистрирован на сервере, пользователь столкнётся с неудачной попыткой входа. Это может произойти, если список ключей доступа у поставщика и сервера не соответствует требованиям.

Чтобы избежать подобных ситуаций, используйте API Сигнала для поддержания их согласованности .

Обновление с беспарольного входа не поддерживается.

На этом этапе создание ключа доступа по условию ограничено вводом пользователем действительного пароля. Это означает, что беспарольные методы входа, такие как «волшебные ссылки», подтверждение номера телефона или федерация удостоверений, не будут соответствовать этому условию.

Краткое содержание

Автоматическое создание ключей доступа может ускорить внедрение ключей доступа на вашем веб-сайте, помогая пользователям перейти от паролей к более безопасному методу аутентификации.

Чтобы узнать больше о ключах доступа, начните с раздела Вход без пароля с ключами доступа .