Проверка обнаружения функции API управления учетными данными

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

WebAuthn помогает повысить безопасность, обеспечивая аутентификацию на основе учетных данных с открытым ключом в Интернете, и вскоре он будет поддерживаться в Chrome, Firefox и Edge ( с обновленной спецификацией ). Он добавляет новый тип объекта Credential , который, однако, может привести к поломке веб-сайтов, использующих API управления учетными данными, без определения конкретных типов учетных данных, которые они используют.

Если вы в настоящее время делаете это для обнаружения функций

if (navigator.credentials && navigator.credentials.preventSilentAccess) {
    // use CM API
}

Вместо этого сделайте это

if (window.PasswordCredential || window.FederatedCredential) {
    // Call navigator.credentials.get() to retrieve stored
    // PasswordCredentials or FederatedCredentials.
}

if (window.PasswordCredential) {
    // Get/Store PasswordCredential
}

if (window.FederatedCredential) {
    // Get/Store FederatedCredential
}

if (navigator.credentials && navigator.credentials.preventSilentAccess) {
    // Call navigator.credentials.preventSilentAccess()
}

В качестве примера см. изменения, внесенные в пример кода.

Читайте дальше, чтобы узнать больше.

Что такое API управления учетными данными

API управления учетными данными (CM API) предоставляет веб-сайтам программный доступ к хранилищу учетных данных пользовательского агента для хранения/получения учетных данных пользователя для вызывающего источника.

Основные API:

  • navigator.credentials.get()
  • navigator.credentials.store()
  • navigator.credentials.create()
  • navigator.credentials.preventSilentAccess()

Исходная спецификация CM API определяет два типа учетных данных:

  • PasswordCredential
  • FederatedCredential

PasswordCredential — это учетные данные, содержащие идентификатор и пароль пользователя. FederatedCredential — это учетные данные, содержащие идентификатор пользователя и строку, представляющую поставщика удостоверений.

С помощью этих двух учетных данных веб-сайты могут:

  • Разрешить пользователю войти в систему с использованием ранее сохраненных учетных данных на основе пароля или федеративных учетных данных сразу после приземления (автоматический вход).
  • Сохраните учетные данные на основе пароля или федеративные учетные данные, с которыми пользователь вошел в систему,
  • Поддерживайте актуальность учетных данных пользователя для входа (например, после смены пароля).

Что такое WebAuthn

WebAuthn (веб-аутентификация) добавляет учетные данные открытого ключа в API CM. Например, он предоставляет веб-сайтам стандартизированный способ реализации двухфакторной аутентификации с использованием устройств аутентификации, совместимых с FIDO 2.0 .

На техническом уровне WebAuthn расширяет API CM интерфейсом PublicKeyCredential .

В чем проблема?

Ранее мы советовали разработчикам обнаруживать API CM с помощью следующего кода:

if (navigator.credentials && navigator.credentials.preventSilentAccess) {
  // Use CM API
}

But as you can see from the descriptions above, the `navigator.credentials` is
now expanded to support public-key credentials in addition to password
credentials and federated credentials.

The problem is that user agents don't necessarily support all kinds of
credentials. If you continue feature detect using `navigator.credentials`, your
website may break when you are using a certain credential type not supported by
the browser.

**Supported credential types by browsers**
<table class="properties with-heading-tint"><tbody><tr>
<th></th>
<th>PasswordCredential / FederatedCredential</th>
<th>PublicKeyCredential</th>
</tr><tr><th>Chrome
</th><td>Available
</td><td>In development
</td></tr><tr><th>Firefox
</th><td>N/A
</td><td>Aiming to ship on 60
</td></tr><tr><th>Edge
</th><td>N/A
</td><td>Implemented with <a href="https://blogs.windows.com/msedgedev/2016/04/12/a-world-without-passwords-windows-hello-in-microsoft-edge/">older API</a>. New API (navigator.credentials) coming soon.
</td></tr></tbody></table>


## The solution
You can avoid this by modifying feature detection code as follows to explicitly
test for the credential type that you intend to use.

```js
if (window.PasswordCredential || window.FederatedCredential) {
    // Call navigator.credentials.get() to retrieve stored
    // PasswordCredentials or FederatedCredentials.
}

if (window.PasswordCredential) {
    // Get/Store PasswordCredential
}

if (window.FederatedCredential) {
    // Get/Store FederatedCredential
}

if (navigator.credentials && navigator.credentials.preventSilentAccess) {
    // Call navigator.credentials.preventSilentAccess()
}

В качестве примера см. фактические изменения, внесенные в пример кода.

Для справки, вот как обнаружить PublicKeyCredential добавленный в WebAuthn:

if (window.PublicKeyCredential) {
    // use CM API with PublicKeyCredential added in the WebAuthn spec
}

Хронология

Самой ранней доступной реализацией WebAuthn является Firefox, и планируется, что ее стабильная версия выйдет примерно в начале мая 2018 года .

Окончательно

Если у вас есть вопросы, отправьте их по адресу @agektmr или agektmr@chromium.org.