Обеспечьте соответствие ключей доступа учетным данным на вашем сервере с помощью Signal API.

Опубликовано: 12 ноября 2024 г., Последнее обновление: 29 ноября 2024 г.

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

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

Chrome поддерживает API Signal на всех настольных платформах и Android.

Safari поддерживает эту функцию , но пока не реализовал её. Firefox пока не поделился своим мнением .

Менеджер паролей Google может обновлять ключи доступа для отражения сигнала. Поставщики ключей доступа на основе расширений Chrome для настольных компьютеров решают, следует ли отображать сигнал.

Фон

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

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

Первый случай — когда пользователь удаляет учётные данные на сервере. При этом ключ доступа у поставщика ключей доступа остаётся нетронутым. При следующей попытке пользователя войти с ключом доступа поставщик ключей доступа по-прежнему предоставит этот ключ. Однако попытка входа завершится неудачей, поскольку сервер не сможет проверить удалённый открытый ключ.

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

API сигналов

Signal API — это API WebAuthn, который устраняет эти несоответствия, позволяя проверяющим сторонам сообщать об изменениях поставщику ключей доступа. Существует три метода:

Сигнал о том, что учетные данные не существуют

const credential = await navigator.credentials.get({ ... });
const payload = credential.toJSON();

const result = await fetch('/login', { ... });

// Detect authentication failure due to lack of the credential
if (result.status === 404) {
  // Feature detection
  if (PublicKeyCredential.signalUnknownCredential) {
    await PublicKeyCredential.signalUnknownCredential({
      rpId: "example.com",
      credentialId: "vI0qOggiE3OT01ZRWBYz5l4MEgU0c7PmAA" // base64url encoded credential ID
    });
  } else {
    // Encourage the user to delete the passkey from the password manager nevertheless.
    ...
  }
}

Вызывая метод PublicKeyCredential.signalUnknownCredential() с идентификаторами RP и учётных данных, RP может сообщить поставщику ключа доступа о том, что указанные учётные данные удалены или не существуют. Поставщик ключа доступа определяет, как обрабатывать этот сигнал, но связанный с ним ключ доступа должен быть удалён, чтобы пользователи не пытались войти с ключом доступа, не связанным с учётными данными.

Browser Support

  • Хром: 132.
  • Край: 132.
  • Firefox: не поддерживается.
  • Сафари: 26.

Source

Этот API можно вызвать в случае сбоя входа с использованием ключа доступа из-за отсутствия учётных данных . Таким образом, проверяющая сторона может предотвратить попытки пользователей войти с ключом доступа, с которым не связаны учётные данные. В отличие от signalAllAcceptedCredentials , этот метод не требует передачи всего списка идентификаторов учётных данных, поэтому используйте его, если пользователь не аутентифицирован, чтобы не раскрывать количество ключей доступа для данного пользователя.

Диалоговое окно, отображаемое при удалении ключа доступа из диспетчера паролей Google в Chrome.
Диалоговое окно, отображаемое при удалении ключа доступа из диспетчера паролей Google в Chrome.

Вывести список сохраненных учетных данных

// After a user deletes a passkey or a user is signed in.

// Feature detection
if (PublicKeyCredential.signalAllAcceptedCredentials) {
  await PublicKeyCredential.signalAllAcceptedCredentials({
    rpId: "example.com",
    userId: "M2YPl-KGnA8", // base64url encoded user ID
    allAcceptedCredentialIds: [ // A list of base64url encoded credential IDs
      "vI0qOggiE3OT01ZRWBYz5l4MEgU0c7PmAA",
      ...
    ]
  });
}

Используйте PublicKeyCredential.signalAllAcceptedCredentials() после входа пользователя в систему или изменения настроек учётной записи. Вы предоставляете список всех действительных идентификаторов учётных данных этого пользователя. Поставщик ключей доступа сравнивает этот список со своим локальным хранилищем для этой проверяющей стороны. Поставщик ключей доступа помечает как «скрытый» любой ключ доступа, найденный в его хранилище, но не включённый в список allAcceptedCredentialIds . Система больше не предлагает эти скрытые ключи доступа для входа или автозаполнения, но они не удаляются немедленно безвозвратно, что позволяет восстановить их при необходимости. И наоборот, поставщик ключей доступа восстанавливает ключи доступа, присутствующие в allAcceptedCredentialIds , помеченные как «скрытые». Это позволяет вашему веб-сайту восстановить ключи доступа, которые были скрыты по ошибке.

Browser Support

  • Хром: 132.
  • Край: 132.
  • Firefox: не поддерживается.
  • Сафари: 26.

Source

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

Сигнал обновил имя пользователя и отображаемое имя

// After a user updated their username and/or display name
// or a user is signed in.

// Feature detection
if (PublicKeyCredential.signalCurrentUserDetails) {
  await PublicKeyCredential.signalCurrentUserDetails({
    rpId: "example.com",
    userId: "M2YPl-KGnA8", // base64url encoded user ID
    name: "a.new.email.address@example.com", // username
    displayName: "J. Doe"
  });
} else {
}

Вызывая метод PublicKeyCredential.signalCurrentUserDetails() с идентификатором RP, идентификатором пользователя, именем пользователя и отображаемым именем, RP может сообщить поставщику ключей доступа об обновлении информации о пользователе. Поставщик ключей доступа определяет, как обрабатывать этот сигнал, но он должен обновить ключи доступа, принадлежащие пользователю, указав новую информацию о пользователе.

Browser Support

  • Хром: 132.
  • Край: 132.
  • Firefox: не поддерживается.
  • Сафари: 26.

Source

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

Диалоговое окно, отображаемое при обновлении метаданных ключа доступа в диспетчере паролей Google в Chrome.
Диалоговое окно, отображаемое при обновлении метаданных ключа доступа в диспетчере паролей Google в Chrome.

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

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

Дополнительную информацию о ключах доступа см. в статье Вход без пароля с ключами доступа .