Узнайте, как WebAuthn Signal API обеспечивает бесшовное удаление Passkeys и обновление метаданных (user.name, user.displayName) на аутентификаторах на стороне клиента.
Vincent
Created: August 8, 2025
Updated: August 8, 2025
See the original blog version in English here.
Our mission is to make the Internet a safer place, and the new login standard passkeys provides a superior solution to achieve that. That's why we want to help you understand passkeys and its characteristics better.
Экосистема Passkeys постоянно развивается. Чтобы способствовать этим изменениям, базовый стандарт WebAuthn также быстро развивается. Новые функции часто начинаются с технического объяснения на GitHub, а затем, после достаточного обсуждения, превращаются в pull request к стандарту. Недавно этот pull request был добавлен в черновик стандарта как WebAuthn Signal API. В этой статье мы рассмотрим:
На момент обновления этого поста в январе 2025 года, WebAuthn Signal API включен по умолчанию начиная с Chrome 132. Ранее он был известен как Reporting API, но был переименован, чтобы избежать конфликтов с другим API с таким же названием.
Recent Articles
📖
WebAuthn pubKeyCredParams и credentialPublicKey: CBOR и COSE
📖
Протокол обмена учетными данными (CXP) и формат обмена (CXF)
🔑
Passkeys и WebAuthn PRF для сквозного шифрования (2025)
📖
Подсказки WebAuthn для учетных данных с открытым ключом / User-Agent
📖
WebAuthn Signal API: Обновление и удаление Passkeys на стороне клиента
WebAuthn Signal API решает конкретные задачи, связанные с управлением Passkeys на стороне клиента. В частности, он помогает синхронизировать информацию между доверяющей стороной (RP) и аутентификаторами, которые являются частью операционных систем на стороне клиента. Существуют следующие важные сценарии использования:
При создании ключа доступа (passkey) он включает в себя несколько частей информации: user.id
, user.name
и user.displayName
. Сам ключ доступа идентифицируется по уникальному Credential ID.
user.id
имеет решающее значение, поскольку он используется для фактического сопоставления ключа доступа с учетной записью пользователя.Следующая иллюстрация показывает типичную простую структуру базы данных, которая объясняет, какая информация обычно хранится в каждом поле:
Важно понимать, что хотя user.name
(часто адрес электронной почты) и user.displayName
(более дружелюбное, читаемое имя) помогают пользователю идентифицировать свою учетную запись в интерфейсе выбора, реальная связь между ключом доступа и учетной записью поддерживается через user.id
и Credential ID:
user.id
.Проблема возникает, когда user.name
, который может быть адресом электронной почты, меняется. В настоящее время не существует механизма для прямого обновления этого изменения на аутентификаторе на стороне клиента. user.name
может измениться по разным причинам, например, когда пользователь обновляет свой адрес электронной почты. Несмотря на это изменение метаданных учетной записи на стороне сервера, старый user.name
будет по-прежнему отображаться в интерфейсе выбора учетных данных, что может сбивать пользователей с толку.
Обходной путь для этой проблемы — создать новый ключ доступа с обновленным user.name
и тем же user.id
, а затем перезаписать существующий ключ. Однако этот подход неудобен по нескольким причинам:
user.id
может иметь только один ключ доступа на один ID доверяющей стороны, что означает, что старый ключ должен быть заменен новым, а это дополнительный шаг.Адреса электронной почты, номера телефонов и другие идентификаторы могут регулярно меняться. Без простого способа прямого обновления user.name
и user.displayName
на аутентификаторе пользователи могут столкнуться с постоянной проблемой, когда они видят и вынуждены выбирать ключ доступа, связанный с их старым адресом электронной почты. Эта ситуация подрывает бесшовный опыт, который призваны обеспечить Passkeys. WebAuthn Signal API решает эту проблему, позволяя доверяющим сторонам сообщать об обновлениях метаданных ключей доступа, не требуя создания новых. Прежде чем мы объясним, как реализовать Signal API, мы рассмотрим второй важный сценарий использования, который он решает.
Еще один важный сценарий использования — удаление ключей доступа на аутентификаторе на стороне клиента. Со временем пользователи могут отзывать учетные данные через список управления ключами доступа или удалять свои учетные записи, и становится необходимым обеспечить удаление этих учетных данных с аутентификатора на стороне клиента, чтобы они не появлялись в будущих интерфейсах выбора учетных данных (Conditional UI / автозаполнение с помощью ключей доступа).
Необходимость в этой функциональности возникает в нескольких сценариях:
С точки зрения пользователя, трудно понять, что удаление в настройках его учетной записи, в диалоговом окне, подобном приведенному выше, не приводит к удалению ключа доступа на этом клиенте.
Без прямого метода удаления ключей доступа на стороне клиента эти устаревшие или недействительные учетные данные продолжают загромождать интерфейс выбора, что приводит к путанице. Пользователи могут видеть и пытаться использовать ключи доступа, которые больше не действительны, что приводит к неудачным попыткам аутентификации и плохому пользовательскому опыту.
Реализация WebAuthn Signal API включает в себя несколько шагов и соображений, чтобы обеспечить правильную и безопасную интеграцию функциональности. Signal API позволяет доверяющим сторонам (RP) обновлять или удалять учетные данные ключей доступа на аутентификаторе на стороне клиента. В этом разделе изложены ключевые соображения и шаги для реализации.
При реализации WebAuthn Signal API крайне важно учитывать следующие моменты:
Сохранение конфиденциальности: WebAuthn Signal API разработан с учетом конфиденциальности пользователей, поскольку это один из основополагающих принципов WebAuthn. Это означает, что RP не получает обратной связи о том, было ли обработано запрошенное изменение. API работает в фоновом режиме, чтобы предотвратить любую потенциальную утечку информации о состоянии учетных данных.
Доступность аутентификатора: Эффективность WebAuthn Signal API зависит от доступности аутентификатора. Это включает как физическую доступность (например, наличие ключа безопасности), так и программную поддержку (например, совместимость браузера и операционной системы). Браузер может выполнять действия только в том случае, если аутентификатор доступен и поддерживает необходимые операции без необходимости биометрической аутентификации.
Ограничения по домену: API гарантирует, что только доверяющая сторона, связанная с определенным доменом, может запрашивать изменения в учетных данных, относящихся к этому домену. Это мера безопасности для предотвращения несанкционированных изменений третьими лицами.
Credential ID как ключ: При обращении к ключам доступа Credential ID является основным ключом, используемым WebAuthn Signal API. Этот ID уникально идентифицирует ключ доступа на аутентификаторе на стороне клиента. API позволяет RP изменять метаданные, связанные с ключами доступа, или сигнализировать о том, что определенные ключи больше не должны использоваться, но только через Credential ID. Если аутентификатор не знает определенный Credential ID, он просто проигнорирует его.
Эти соображения необходимы для понимания наиболее важных аспектов правильной работы WebAuthn Signal API.
WebAuthn Signal API предоставляет оптимизированный механизм для доверяющих сторон (RP) для обновления метаданных, связанных с ключами доступа на аутентификаторах на стороне клиента. Это особенно важно для того, чтобы пользователи видели точную и актуальную информацию в интерфейсе выбора учетных данных без необходимости излишнего создания новых ключей доступа. Вот как API позволяет это делать:
Обновление метаданных с помощью signalCurrentUserDetails(options)
Метод signalCurrentUserDetails(options)
в Signal API специально разработан для обновления метаданных ключей доступа. Этот метод позволяет RP предоставлять текущие значения для user.name
и user.displayName
.
Вот как работает этот процесс (см. также стандарт WebAuthn Level 3).
signalCurrentUserDetails(options)
включает rp.id
, user.id
и обновленные значения для user.name
и user.displayName
.PublicKeyCredential.signalCurrentUserDetails({ rpId: "example.com", userId: "aabbcc", // user handle, base64url. name: "New user name", displayName: "New display name", });
Обновление локальных метаданных: Поиск локально доступных (на аутентификаторе) учетных данных, которые соответствуют rpId
и userId
. Для всех совпадающих учетных данных аутентификатор обновит name
и displayName
.
Сохранение конфиденциальности: Процесс разработан с учетом сохранения конфиденциальности. Signal API не предоставляет RP обратной связи о том, были ли обновления успешно обработаны, что предотвращает утечку информации о состоянии учетных данных.
Согласованность на разных устройствах: Регулярно запуская методы signalCurrentUserDetails(options)
, RP могут обеспечить согласованность метаданных для ключей доступа на разных устройствах и платформах, где пользователь может проходить аутентификацию. Этот подход снижает вероятность отображения устаревшей или неверной информации в интерфейсе выбора учетных данных.
На скриншоте выше вы можете видеть, как Google Chrome сообщает пользователю о таком обновлении. WebAuthn Signal API является частью Chrome 130 и может быть протестирован с помощью Google Password Manager на десктопе, если активирован флаг экспериментальных веб-функций.
WebAuthn Signal API предоставляет механизмы для доверяющих сторон (RP) для сигнализации об удалении ключей доступа с аутентификаторов на стороне клиента. Это необходимо для того, чтобы устаревшие или недействительные учетные данные не появлялись в интерфейсе выбора, поддерживая тем самым оптимизированный и безопасный пользовательский опыт. Существует два метода для локального удаления ключей доступа: signalUnknownCredential(options)
и signalAllAcceptedCredentials(options)
. Первый можно использовать в ситуациях, когда пользователь не аутентифицирован, а второй — когда пользователь аутентифицирован. Поэтому по соображениям конфиденциальности предпочтение следует отдавать второму методу.
Вот как работают эти два метода:
signalUnknownCredential(options)
включает rpId
(ID доверяющей стороны) и credentialId
(уникальный идентификатор учетных данных, которые нужно удалить).PublicKeyCredential.signalUnknownCredential({ rpId: "example.com", credentialId: "aabbcc", // credential id the user just tried, base64url });
Вызов метода: RP вызывают этот метод всякий раз, когда обнаруживают, что учетные данные должны быть удалены. Это может произойти сразу после попытки аутентификации с недействительными учетными данными, во время удаления учетной записи или когда пользователь отзывает учетные данные через настройки.
Обработка метода: Когда вызывается метод signalUnknownCredential(options)
, аутентификатор на стороне клиента пытается найти учетные данные, соответствующие указанным rpId
и credentialID
, для исключения. В зависимости от возможностей аутентификатора, учетные данные удаляются или применяется специфичная для аутентификатора процедура для их скрытия в будущих церемониях аутентификации.
signalAllAcceptedCredentials(options)
включает rpId
(ID доверяющей стороны), userId
и список действительных Credential ID allAcceptedCredentialIds
(список уникальных идентификаторов учетных данных, которые следует сохранить).PublicKeyCredential.signalAllAcceptedCredentials({ rpId: "example.com", userId: "aabbcc", // user handle, base64url. allAcceptedCredentialIds: ["bb"], });
Вызов метода: RP вызывают этот метод, когда обнаруживают, что учетные данные должны быть удалены, и передают список действительных учетных данных. Этот метод предпочтительнее signalUnknownCredential(options)
для удаления учетных данных.
Обработка метода: Когда вызывается метод signalAllAcceptedCredentials(options)
, аутентификатор на стороне клиента сопоставляет rpId
и userId
. Аутентификатор ищет все локальные учетные данные, соответствующие rpId
и userId
. Результат сравнивается с allAcceptedCredentialIds
. Если есть локальные учетные данные, которых нет в allAcceptedCredentialIds
, они удаляются локально (или скрываются, в зависимости от аутентификатора).
Восстановление скрытых учетных данных: Если учетные данные были только скрыты (в зависимости от аутентификатора) и теперь являются частью allAcceptedCredentialIds
, они снова будут присутствовать в будущих церемониях аутентификации.
Полезные советы:
signalAllAcceptedCredentials(options)
важно помнить, что аутентификаторы могут быть не подключены в момент выполнения этого метода. В результате доверяющим сторонам стоит рассмотреть возможность периодического запуска signalAllAcceptedCredentials(options)
, например, при каждом входе в систему, чтобы обеспечить актуальность всех учетных данных.allAcceptedCredentialIds
). Учетные данные, не включенные в этот список, могут быть скрыты или удалены аутентификатором, возможно, безвозвратно. Чтобы предотвратить случайное исключение действительных учетных данных, крайне важно убедиться, что список полон. Если действительный Credential ID был случайно пропущен, его следует как можно скорее снова добавить в signalAllAcceptedCredentials(options)
, чтобы он снова стал видимым, при условии, что аутентификатор это поддерживает.На скриншоте выше вы можете видеть, как Google Chrome сигнализирует об удалениях. WebAuthn Signal API является частью Chrome 132 и может быть протестирован с помощью Google Password Manager на десктопе.
Чтобы эффективно реализовать WebAuthn Signal API и обеспечить бесшовную синхронизацию метаданных ключей доступа на аутентификаторах на стороне клиента, рассмотрите следующие рекомендации:
signalAllAcceptedCredentials(options)
после каждого успешного входа: Этот подход гарантирует, что все метаданные и Credential ID обновляются одним методом, что упрощает процесс, поддерживает согласованность на разных устройствах и платформах и одновременно деактивирует удаленные или устаревшие учетные данные.signalUnknownCredential(options)
для крупномасштабных развертываний: Рассмотрите возможность использования обмена сообщениями в реальном времени с методом signalUnknownCredential(options)
в крупномасштабных развертываниях или когда требуется немедленное обновление. Этот метод может повысить эффективность и точность управления учетными данными, обеспечивая быстрое удаление недействительных или устаревших учетных данных из интерфейса выбора.Следуя этим рекомендациям, вы сможете эффективно реализовать WebAuthn Signal API, как только он получит поддержку, обеспечивая актуальность и согласованность метаданных ключей доступа на всех аутентификаторах на стороне клиента, тем самым предоставляя плавный и безопасный пользовательский опыт для Passkeys.
Стандарт WebAuthn постоянно развивается, ежемесячно становясь все более многофункциональным. Внедрение WebAuthn Signal API — это значительный шаг вперед в управлении метаданными и удалением ключей доступа на аутентификаторах на стороне клиента. Этот API решает важнейшие задачи по синхронизации информации между доверяющими сторонами (RP) и аутентификаторами, а также обеспечивает удаление недействительных или устаревших ключей доступа, тем самым улучшая пользовательский опыт.
user.name
и user.displayName
, которая может вызывать путаницу при представлении учетных данных в интерфейсе выбора. Кроме того, он помогает поддерживать чистый и безопасный интерфейс выбора учетных данных, удаляя отозванные или удаленные ключи доступа.По мере развития стандарта WebAuthn он выигрывает от разнообразия интересов его участников, которые продвигают вперед различные части стандарта. Важно следить за этими разработками, чтобы быть в курсе последних улучшений и обеспечивать соответствие реализаций новейшим практикам и стандартам. Сообщество WebAuthn продолжает стимулировать инновации, делая аутентификацию более безопасной и удобной для пользователя.
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