---
url: 'https://www.corbado.com/ru/blog/webauthn-server-implementation'
title: '9 библиотек серверов WebAuthn: сравнение и выбор'
description: 'Это руководство поможет вам выбрать подходящую библиотеку сервера WebAuthn для реализации ключей доступа (passkeys). Сравнение 9 библиотек и стратегии выбора.'
lang: 'ru'
author: 'Nicolai'
date: '2026-07-27T08:26:18.862Z'
lastModified: '2026-07-27T08:27:38.280Z'
keywords: 'реализация сервера webauthn, библиотека сервера webauthn, ключи доступа, passkeys, webauthn server, fido2'
category: 'Passkeys Implementation'
---

# 9 библиотек серверов WebAuthn: сравнение и выбор

## Key Facts

- **SimpleWebAuthn** (TypeScript, 1 000 звезд на GitHub) признана наиболее интуитивно понятной и является уникальной библиотекой, предоставляющей как серверную, так и клиентскую (браузерную) части для реализации ключей доступа.
- Аутентификация по ключам доступа требует как минимум **четырех конечных точек API бэкенда** (в отличие от одной для паролей), что делает использование библиотеки сервера WebAuthn необходимым для работы со сложной криптографией.
- **py_webauthn** (Python) идеально подходит для быстрого тестирования: параметры аутентификации генерируются одним вызовом метода и не требуют настройки фреймворка.
- **webauthn-framework** (PHP/Symfony, 347 звезд) предлагает наиболее подробную концептуальную документацию, что делает ее лучшим выбором для разработчиков, изучающих основы ключей доступа с нуля.
- Если для вашего языка программирования нет подходящей библиотеки, **go-webauthn** или SimpleWebAuthn рекомендуются в качестве запасных вариантов благодаря их широкому распространению в коммерческих проектах и проектах с открытым исходным кодом.

## 1. Введение: реализация сервера WebAuthn

Обеспечение безопасной и простой аутентификации пользователей — обязательное требование для цифровых компаний в 2024 году. Ключи доступа (passkeys), как новый стандарт входа в систему, являются идеальным решением для удовлетворения этих потребностей.
Однако повышенное удобство и безопасность ключей доступа для пользователей обходятся разработчикам дорогой ценой при их реализации. Сложность внедрения связана с тем, что ключи доступа — относительно новая технология не только для пользователей, но и для разработчиков, и их реализация может быть довольно сложной по сравнению с аутентификацией на основе паролей. На самом деле для аутентификации по ключам доступа требуется как минимум четыре конечные точки API, в то время как для аутентификации по паролю — всего одна.

Одним из основных компонентов на стороне сервера для обеспечения аутентификации с помощью ключей доступа является **сервер WebAuthn (зеленая часть библиотеки)**. Подробное руководство по интеграции сервера WebAuthn в более широкую корпоративную архитектуру см. в нашей отдельной статье.

![Архитектура сервера WebAuthn](https://www.corbado.com/website-assets/657d793ffb87095054194ebb_webauthn_server_architecture_e9ba5ad00c.png)_Источник:
[Yubico](https://developers.yubico.com/java-webauthn-server/)_

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

## 2. Как я могу реализовать ключи доступа самостоятельно?

Чтобы лучше понять, зачем вообще нужна **библиотека сервера WebAuthn**, давайте посмотрим, как можно внедрить ключи доступа. В принципе, существует два способа интеграции ключей доступа на веб-сайты и в приложения:

1. Использовать стороннее решение для ключей доступа (например, Corbado).
2. Реализовать ключи доступа самостоятельно с помощью одной из библиотек серверов WebAuthn, перечисленных ниже.

Хотя стороннее решение легко интегрировать, и оно обычно экономит много времени инженеров (особенно на пограничные случаи, обслуживание, восстановление, резервные варианты и улучшенный UX), некоторые разработчики предпочитают реализовывать все самостоятельно.

Давайте посмотрим, как работает самостоятельная реализация ключей доступа. В самой базовой настройке необходим механизм для регистрации (sign-up) и аутентификации (login). Оба процесса, также называемые церемониями WebAuthn, обрабатываются по-разному, хотя общий поток следует похожей схеме:

1. **Фронтенд (браузер) инициирует** запрос на регистрацию или вход и **вызывает конечную точку API бэкенда**.
2. **Бэкенд генерирует параметры WebAuthn** для регистрации или входа. Они называются `PublicKeyCredentialCreationOptions` и `PublicKeyCredentialRequestOptions` соответственно. Одной из важнейших частей этих параметров является вызов (challenge). Затем параметры WebAuthn **отправляются обратно на фронтенд**.
3. **Фронтенд** получает эти параметры и использует их для **подтверждения личности пользователя** с помощью локальной системы аутентификации устройства (например, Face ID, Touch ID, Windows Hello). В процессе регистрации создается новая пара открытого и закрытого ключей, закрытый ключ сохраняется локально, а открытый отправляется на сервер. При входе **вызов подписывается** с помощью закрытого ключа и отправляется на другую конечную точку API бэкенда.
4. В процессе регистрации бэкенд **получает открытый ключ** и сохраняет его. При входе бэкенд **получает подписанный вызов и проверяет его целостность** с помощью сервера WebAuthn.

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

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

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

- Управление устройствами
- Кроссплатформенные и кросс-девайсные процессы входа
- Управление пользователями
- Управление сессиями
- Обнаружение готовности устройств к работе с ключами доступа
- Обучение пользователей
- Резервные методы аутентификации
- Механизмы восстановления
- Опции для совместного использования аккаунтов
- Оптимизированные процессы создания ключей доступа и входа для высокого уровня принятия

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

## 3. Бэкенд-библиотеки серверов WebAuthn: сравнение

Все проанализированные библиотеки предоставляют необходимые функции для аутентификации по ключам доступа. Поэтому мы уделили особое внимание следующим критериям:

- **Критерии выбора аутентификатора:** Как можно задать предпочтения для определенного поведения и функций безопасности (например, принудительное создание резидентных ключей)?
- **Глобальные настройки:** Насколько можно централизовать необходимую конфигурацию?
- **Документация:** Насколько хорошо документирована библиотека и легко ли ей следовать?
- **Примеры:** Есть ли примеры реализаций, которые можно взять за основу?

Были проанализированы следующие библиотеки серверов WebAuthn (отсортированы по убыванию количества звезд на GitHub в декабре 2023 года):

### 3.1 TypeScript: SimpleWebAuthn

![SimpleWebAuthn](https://www.corbado.com/website-assets/657d796db359dbc15ca87b17_webauthn_server_simplewebauthn_458503b246.png)

- **Язык программирования:** Typescript
- **Фреймворк:** Node.js
- **Автор:** Matthew Miller (Duo Security / Cisco)
- **Звезды:** 1 000
- **Используется:** 781
- **Контрибьюторы:** 19
- **Соответствие FIDO:** Да
- **Глобальные настройки:** Нет
- **Критерии выбора аутентификатора:** Как [предложено W3C](https://www.w3.org/TR/webauthn-2/#dictionary-authenticatorSelection) (должны содержать переменные authenticatorAttachment, residentKey, requireResidentKey и userVerification)
- **Документация:** Отлично структурирована с акцентом на быструю настройку и простоту использования.
- **Примеры:** Пример проекта доступен в [документации](https://simplewebauthn.dev/docs/advanced/example-project).
- **Рекомендуемые структуры данных:**

```json
type UserModel = {
  id: string;
  username: string;
  currentChallenge?: string;
};

/**
 * It is strongly advised that authenticators get their own DB
 * table, ideally with a foreign key to a specific UserModel.
 *
 * "SQL" tags below are suggestions for column data types and
 * how best to store data received during registration for use
 * in subsequent authentications.
 */
type Authenticator = {
  // SQL: Encode to base64url then store as `TEXT`. Index this column
  credentialID: Uint8Array;
  // SQL: Store raw bytes as `BYTEA`/`BLOB`/etc...
  credentialPublicKey: Uint8Array;
  // SQL: Consider `BIGINT` since some authenticators return atomic timestamps as counters
  counter: number;
  // SQL: `VARCHAR(32)` or similar, longest possible value is currently 12 characters
  // Ex: 'singleDevice' | 'multiDevice'
  credentialDeviceType: CredentialDeviceType;
  // SQL: `BOOL` or whatever similar type is supported
  credentialBackedUp: boolean;
  // SQL: `VARCHAR(255)` and store string array as a CSV string
  // Ex: ['usb' | 'ble' | 'nfc' | 'internal']
  transports?: AuthenticatorTransport[];
};
```

- **Другие характеристики:** Отличный [WebAuthn Debugger](https://debugger.simplewebauthn.dev/) и наличие клиентской библиотеки.
- **Личная оценка:** Самая интуитивная настройка.
- **Ссылка на GitHub:** [https://github.com/MasterKale/SimpleWebAuthn](https://github.com/MasterKale/SimpleWebAuthn)

![Скриншот SimpleWebAuthn](https://www.corbado.com/website-assets/657d797be263ba3262fff816_webauthn_server_simplewebauthn_screenshot_527317d6be.png)

### 3.2 .NET: fido2-net-lib

![fido2-net-lib](https://www.corbado.com/website-assets/657d79968cef2987ff7c9c21_webauthn_server_fido2_net_lib_6727019f82.png)

- **Язык программирования:** C#
- **Фреймворк:** .NET
- **Авторы:** Anders Åberg, Alex Seigler
- **Звезды:** 962
- **Используется:** 200
- **Контрибьюторы:** 40
- **Соответствие FIDO:** Да
- **Глобальные настройки:** Да
- **Критерии выбора аутентификатора:** Как предложено W3C
- **Документация:** Только Readme с несколькими примерами, немного [passkey intelligence](https://docs.corbado.com/corbado-connect/features/passkey-intelligence) на [сайте](https://fido2-net-lib.passwordless.dev/) библиотеки.
- **Примеры:** Доступны демо-контроллер и пример хранилища учетных данных.
- **Рекомендуемая структура данных:**

```json
public class StoredCredential
{
    /// <summary>
    /// The Credential ID of the public key credential source.
    /// </summary>
    public byte[] Id { get; set; }

    /// <summary>
    /// The credential public key of the public key credential source.
    /// </summary>
    public byte[] PublicKey { get; set; }

    /// <summary>
    /// The latest value of the signature counter in the authenticator data from any ceremony using the public key credential source.
    /// </summary>
    public uint SignCount { get; set; }

    /// <summary>
    /// The value returned from getTransports() when the public key credential source was registered.
    /// </summary>
    public AuthenticatorTransport[] Transports { get; set; }

    /// <summary>
    /// The value of the BE flag when the public key credential source was created.
    /// </summary>
    public bool IsBackupEligible { get; set; }

    /// <summary>
    /// The latest value of the BS flag in the authenticator data from any ceremony using the public key credential source.
    /// </summary>
    public bool IsBackedUp { get; set; }

    /// <summary>
    /// The value of the attestationObject attribute when the public key credential source was registered.
    /// Storing this enables the Relying Party to reference the credent’al's attestation statement at a later time.
    /// </summary>
    public byte[] AttestationObject { get; set; }

    /// <summary>
    /// The value of the clientDataJSON attribute when the public key credential source was registered.
    /// Storing this in combination with the above attestationObject item enables the Relying Party to re-verify the attestation signature at a later time.
    /// </summary>
    public byte[] AttestationClientDataJson { get; set; }

    public List<byte[]> DevicePublicKeys { get; set; }

    public byte[] UserId { get; set; }

    public PublicKeyCredentialDescriptor Descriptor { get; set; }

    public byte[] UserHandle { get; set; }

    public string AttestationFormat { get; set; }

    public DateTimeOffset RegDate { get; set; }

    public Guid AaGuid { get; set; }
}
```

- **Другие характеристики:** Используется Bitwarden.
- **Личная оценка:** Удобная для разработчиков библиотека с хорошим набором дополнительных материалов.
- **Ссылка на GitHub:** [https://github.com/passwordless-lib/fido2-net-lib](https://github.com/passwordless-lib/fido2-net-lib)

![Скриншот fido2-net-lib](https://www.corbado.com/website-assets/657d79aefc6fa186be1a722e_webauthn_server_fido2_net_lib_screenshot_a624ecd3d2.png)

### 3.3 Python: py_webauthn

![py_webauthn](https://www.corbado.com/website-assets/657d79c9b1ac103f4c903ec1_webauthn_server_py_webauthn_416b6eae90.jpg)

- **Язык программирования:** Python
- **Фреймворк:** Нет конкретного
- **Автор:** Duo Labs
- **Звезды:** 727
- **Используется:** 912
- **Контрибьюторы:** 23
- **Соответствие FIDO:** Н/Д
- **Глобальные настройки:** Нет
- **Критерии выбора аутентификатора:** Как предложено W3C
- **Документация:** Практически отсутствует, требуются предварительные знания о ключах доступа.
- **Примеры:** Включены небольшие примеры кода для регистрации и входа.
- **Рекомендуемая структура данных:** Н/Д
- **Другие характеристики:** Требуется Python >= 3.8
- **Личная оценка:** Сравнительно компактная библиотека с небольшим количеством файлов.
- **Ссылка на GitHub:** [https://github.com/duo-labs/py_webauthn](https://github.com/duo-labs/py_webauthn)

![Скриншот py_webauthn](https://www.corbado.com/website-assets/657d79da1eee1bef26c8ef4b_webauthn_server_py_webauthn_screenshot_5292be32e1.png)

### 3.4 Ruby: webauthn-ruby

![webauthn-ruby](https://www.corbado.com/website-assets/657d79ef3b5153896eb8fd4c_webauthn_server_webauthn_ruby_4fc3b288bd.png)

- **Язык программирования:** Ruby
- **Фреймворк:** Ruby on Rails
- **Автор:** Cedarcode
- **Звезды:** 580
- **Используется:** 679
- **Загрузки Gem:** 18 млн
- **Контрибьюторы:** 27
- **Соответствие FIDO:** Да
- **Глобальные настройки:** Да
- **Критерии выбора аутентификатора:** Как предложено W3C
- **Документация:** Readme — единственный источник документации.
- **Примеры:** Н/Д
- **Рекомендуемая структура данных:** Н/Д
- **Другие характеристики:** Доступны обертки для этой библиотеки ([warden-webauthn](https://github.com/ruby-passkeys/warden-webauthn), [devise-passkeys](https://github.com/ruby-passkeys/devise-passkeys)).
- **Личная оценка:** Поскольку дополнительных материалов довольно мало, мы рекомендуем эту библиотеку, только если вы знакомы как с Ruby, так и с ключами доступа.
- **Ссылка на GitHub:** [https://github.com/cedarcode/webauthn-ruby](https://github.com/cedarcode/webauthn-ruby)

![Скриншот webauthn-ruby](https://www.corbado.com/website-assets/657d79fd54838aafd2274e4e_webauthn_server_webauthn_ruby_screenshot_7fb391a360.png)

### 3.5 Go: go-webauthn

![go-webauthn](https://www.corbado.com/website-assets/657d7a13b1ac103f4c908c60_webauthn_server_go_webauthn_f4f8db52ec.png)

- **Язык программирования:** Go
- **Фреймворк:** Фреймворки на базе Go (Gin, Echo и т.д.)
- **Автор:** Изначально Duo Labs / продолжил James Elliott
- **Звезды:** 480
- **Используется:** 280
- **Контрибьюторы:** 18
- **Соответствие FIDO:** Да
- **Глобальные настройки:** Да
- **Критерии выбора аутентификатора:** Как предложено W3C
- **Документация:** Readme с некоторыми примерами.
- **Примеры:** Доступен [репозиторий с примерами](https://github.com/ruby-passkeys/devise-passkeys).
- **Рекомендуемая структура данных:** Н/Д
- **Другие характеристики:** Большое количество файлов.
- **Личная оценка:** Популярная библиотека, простая в использовании, когда вы с ней освоитесь.
- **Ссылка на GitHub:** [https://github.com/go-webauthn/webauthn](https://github.com/go-webauthn/webauthn)

![Скриншот go-webauthn](https://www.corbado.com/website-assets/657d7a266276ea8bd12bb480_webauthn_server_go_webauthn_screenshot_4bf908cdfd.png)

### 3.6 Java: java-webauthn-server

![java-webauthn-server](https://www.corbado.com/website-assets/657d7a49ac1b2446296c4e2b_webauthn_server_java_webauthn_server_368503276e.png)

- **Язык программирования:** Java
- **Фреймворк:** Maven / Gradle
- **Автор:** Yubico
- **Звезды:** 391
- **Используется:** Н/Д
- **Контрибьюторы:** 27
- **Соответствие FIDO:** Н/Д
- **Глобальные настройки:** Да
- **Критерии выбора аутентификатора:** Как предложено W3C.
- **Документация:** Readme — единственная, но довольно подробная документация.
- **Примеры:** Н/Д
- **Рекомендуемая структура данных:** Н/Д
- **Другие характеристики:** Поставляется с интерфейсом Credential Repository, предоставляющим четкие инструкции по необходимым методам извлечения данных из БД.
- **Личная оценка:** Хотя вам придется управлять базой данных самостоятельно, репозиторий учетных данных значительно помогает в процессе проектирования БД.
- **Ссылка на GitHub:** [https://github.com/Yubico/java-webauthn-server](https://github.com/Yubico/java-webauthn-server)

![Скриншот java-webauthn-server](https://www.corbado.com/website-assets/657d7a5aeac136d96d1bb459_webauthn_server_java_webauthn_server_screenshot_0cc89ca1ab.png)

### 3.7 Rust: webauthn-rs

![webauthn-rs](https://www.corbado.com/website-assets/657d7a6dd61bd50a76f5d9ca_webauthn_server_webauthn_rs_1be32ca83b.png)

- **Язык программирования:** Rust
- **Фреймворк:** На базе Rust (Rocket, Axum и т.д.)
- **Автор:** Kanidm Identity Management Project
- **Звезды:** 351
- **Используется:** 617
- **Контрибьюторы:** 25
- **Соответствие FIDO:** Н/Д
- **Глобальные настройки:** Да
- **Критерии выбора аутентификатора:** Очень ограниченные возможности настройки по сравнению с другими.
- **Документация:** Существует автоматически генерируемая техническая документация, но она не очень подробная.
- **Примеры:** Доступен [репозиторий с руководством](https://github.com/kanidm/webauthn-rs/tree/master/tutorial) с примерами для 3 различных веб-фреймворков.
- **Рекомендуемая структура данных:** Н/Д
- **Другие характеристики:** Библиотека прошла аудит безопасности, проведенный отделом безопасности продуктов SUSE.
- **Личная оценка:** Из-за ограниченных возможностей конфигурации и документации мы рекомендуем эту библиотеку, только если вашим основным фреймворком является фреймворк на базе Rust.
- **Ссылка на GitHub:** [https://github.com/kanidm/webauthn-rs](https://github.com/kanidm/webauthn-rs)

![Скриншот webauthn-rs](https://www.corbado.com/website-assets/657d7a7db359dbc15ca91760_webauthn_server_webauthn_rs_screenshot_cc92cc955d.png)

### 3.8 PHP: webauthn-framework

![webauthn-framework](https://www.corbado.com/website-assets/657d7bd762d48bffd4a9b34d_webauthn_server_webauthn_framework_07cf99330e.png)

- **Язык программирования:** PHP
- **Фреймворк:** Symfony
- **Автор:** Florent Morselli
- **Звезды:** 347
- **Используется:** Н/Д
- **Контрибьюторы:** 18
- **Соответствие FIDO:** Да
- **Глобальные настройки:** Да
- **Критерии выбора аутентификатора:** Как предложено W3C.
- **Документация:** Обширная документация, включающая технические детали, а также объясняющая ключи доступа с нуля.
- **Примеры:** Доступен [репозиторий с примерами](https://github.com/web-auth/symfony-webauthn-demo).
- **Рекомендуемая структура данных:**

```php
<?php

declare(strict_types=1);

namespace App\Entity;

use App\Repository\PublicKeyCredentialSourceRepository;
use DateTimeImmutable;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Uid\AbstractUid;
use Symfony\Component\Uid\Uuid;
use Webauthn\PublicKeyCredentialSource as BasePublicKeyCredentialSource;
use Webauthn\TrustPath\TrustPath;

#[ORM\Table(name: 'pk_credential_sources')]
#[ORM\Entity(repositoryClass: PublicKeyCredentialSourceRepository::class)]
class PublicKeyCredentialSource extends BasePublicKeyCredentialSource
{
    #[ORM\Column(type: Types::DATETIME_IMMUTABLE)]
    public readonly DateTimeImmutable $createdAt;

    #[ORM\Id]
    #[ORM\Column(type: Types::STRING, length: 255)]
    #[ORM\GeneratedValue(strategy: 'NONE')]
    private string $id;

    public function __construct(
        string $publicKeyCredentialId,
        string $type,
        array $transports,
        string $attestationType,
        TrustPath $trustPath,
        AbstractUid $aaguid,
        string $credentialPublicKey,
        string $userHandle,
        int $counter
    ) {
        $this->id = Uuid::v4()->toRfc4122();
        $this->createdAt = new DateTimeImmutable();
        parent::__construct($publicKeyCredentialId, $type, $transports, $attestationType, $trustPath, $aaguid, $credentialPublicKey, $userHandle, $counter);
    }

    public function getId(): string
    {
        return $this->id;
    }
}
```

- **Другие характеристики:** Н/Д
- **Личная оценка:** Хорошо подходит для людей, которые хотят изучить ключи доступа, но не имеют предварительных знаний.
- **Ссылка на GitHub:** [https://github.com/web-auth/webauthn-framework](https://github.com/web-auth/webauthn-framework)

![Скриншот webauthn-framework](https://www.corbado.com/website-assets/657d7be96276ea8bd12cb5fd_webauthn_server_webauthn_framework_screenshot_9c1e9a3dd8.png)

### 3.9 Java: webauthn4j

![webauthn4j](https://www.corbado.com/website-assets/657d7c00fe6a1b80f0f03fd6_webauthn_server_webauthn4j_d8c4d2a9de.png)

- **Язык программирования:** Java
- **Фреймворк:** Maven
- **Автор:** WebAuthn4j
- **Звезды:** 342
- **Используется:** Н/Д
- **Контрибьюторы:** 19
- **Соответствие FIDO:** Да
- **Глобальные настройки:** Да
- **Критерии выбора аутентификатора:** Вместо предложенного W3C параметра UserVerificationRequirement, webauthn4j предлагает verificationRequired и userPresenceRequired.
- **Документация:** Сухая, но обширная документация с несколькими примерами кода.
- **Примеры:** Доступен [репозиторий с примерами](https://github.com/webauthn4j/webauthn4j-spring-security).
- **Рекомендуемая структура данных:** Н/Д
- **Другие характеристики:** Н/Д
- **Личная оценка:** Документация сосредоточена исключительно на функциональности.
- **Ссылка на GitHub:** [https://github.com/webauthn4j/webauthn4j](https://github.com/webauthn4j/webauthn4j)

![Скриншот webauthn4j](https://www.corbado.com/website-assets/657d7c7fb359dbc15caa2007_webauthn_server_webauthn4j_screenshot_3d7616a5e5.png)

В следующей таблице представлен обзор библиотек серверов WebAuthn:

![Обзор серверов WebAuthn](https://www.corbado.com/website-assets/657d7c8fffd0b1429fd8d276_webauthn_server_implementation_overview_92a55c2e0f.png)

## 4. Рекомендации: Навигация по ландшафту библиотек WebAuthn

### 4.1 Шаг 1: Выберите библиотеку WebAuthn

Поскольку большинство библиотек одинаково мощны и реализуют стандарт WebAuthn, мы рекомендуем следующее дерево решений:

- **Доступна библиотека сервера WebAuthn на вашем фреймворке и языке программирования:** В этом случае выберите ее, так как она позволяет нативно внедрить вызовы API WebAuthn в текущую структуру вашего фреймворка.
- **Доступна библиотека сервера WebAuthn на вашем языке программирования:** Выберите библиотеку на вашем родном языке программирования, чтобы она могла быть нативно встроена в ваши текущие конечные точки API.
- **Нет доступной библиотеки сервера WebAuthn на вашем языке программирования:** В этом случае вам следует рассмотреть использование управляемого решения, такого как Corbado. Если это не вариант, мы рекомендуем использовать go-webauthn или SimpleWebAuthn.

Если вы просто хотите узнать больше о серверах WebAuthn в целом, мы можем дать несколько рекомендаций:

- **Для быстрого тестирования:** пакет _py_webauthn_ предлагает мгновенную реализацию с готовыми к использованию [фрагментами кода](https://github.com/duo-labs/py_webauthn/blob/master/examples/registration.py).
- **Для интуитивно понятной реализации:** пакет _SimpleWebauthn_, написанный на Typescript, прямолинеен и удобен для разработчиков.
- **Для глубокого понимания:** библиотека _webauthn-framework_ для PHP выделяется обширной и структурированной [документацией](http://Link), ориентированной на концепции ключей доступа.

Для еще более глубокого понимания того, как работает WebAuthn на стороне сервера, вы можете прочитать очень подробный раздел "WebAuthn Relying Party Operations" в RFC WebAuthn, который детализирует каждый шаг, необходимый для [регистрации новых учетных данных (7.1)](https://www.w3.org/TR/webauthn-2/#sctn-registering-a-new-credential) и [проверки утверждения аутентификации (7.2)](https://www.w3.org/TR/webauthn-2/#sctn-verifying-assertion).

### 4.2 Шаг 2: Определите параметры сервера WebAuthn

Оцените ваши конкретные требования к ключам доступа и WebAuthn. Прочитайте о параметрах `PublicKeyCredentialCreationOptions` и `PublicKeyCredentialRequestOptions` вместе с клиентскими вызовами API WebAuthn `navigator.credentials.create()` и `navigator.credentials.get()`.

### 4.3 Шаг 3: Определите структуру базы данных

Для всех библиотек серверов WebAuthn вам потребуется предоставить соответствующую структуру базы данных для хранения и доступа к следующей информации:

- Учетные данные (Credentials)
- Пользователи (Users)
- Вызовы (Challenges)
- Аутентификаторы (Authenticators)

Крайне важно полностью понимать, какие поля WebAuthn необходимо хранить и где. Обратите особое внимание на то, какое значение вы хотите использовать для идентификатора пользователя (user.id). Также примите во внимание, что происходит, когда пользователь может удалить ключ доступа. Список действительных аутентификаторов, связанных с ключами доступа, можно найти [здесь](https://github.com/passkeydeveloper/passkey-authenticator-aaguids). Дополнительную информацию можно найти [здесь](https://fidoalliance.org/metadata/).

### 4.4 Шаг 4: Тестирование на устройствах пользователей

Определите, на каких устройствах ваши пользователи будут использовать ключи доступа и резервные методы аутентификации. Если вы не уверены, проверьте [State of Passkeys](https://state-of-passkeys.io/) для получения последних данных о готовности к работе с ключами доступа. С точки зрения наблюдаемости (observability), храните клиентские сбои WebAuthn и отклонения при проверке сервером как отдельные потоки данных. Кроме того, следует помнить, что для Windows 10 и Linux вам потребуется придумать специальные решения, поскольку эти операционные системы обеспечивают наименьшую (если вообще обеспечивают) поддержку ключей доступа.

## 5. Заключение

В настоящее время почти для каждого языка или фреймворка существует хорошо зарекомендовавшая себя библиотека сервера WebAuthn. Сравнение библиотек не показывает явного превосходства определенных реализаций. Скорее вам следует использовать фреймворк или язык программирования, с которым вы лучше всего знакомы. В качестве альтернативы, если вы не хотите реализовывать WebAuthn самостоятельно, вы можете попробовать готовое решение, такое как Corbado. Вы можете попробовать его бесплатно с неограниченным количеством пользователей [здесь](https://app.corbado.com/signin#register).

## Часто задаваемые вопросы

### Как выбрать подходящую библиотеку сервера WebAuthn для моего проекта?

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

### Какие данные мне нужно хранить в базе данных при создании сервера WebAuthn?

Как минимум вы должны сохранять учетные данные, пользователей, вызовы (challenges) и аутентификаторы. Обратите пристальное внимание на то, какое значение вы назначаете в качестве идентификатора пользователя (userHandle), и спланируйте сценарии, при которых пользователи могут удалить ключ доступа (passkey) со своего устройства.

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

Библиотеки серверов WebAuthn обрабатывают самые сложные криптографические операции: генерацию параметров PublicKeyCredentialCreationOptions и PublicKeyCredentialRequestOptions, а также проверцию подписанных вызовов. Сделать это правильно с нуля значительно сложнее, чем использовать проверенную и прошедшую аудит библиотеку, соответствующую стандарту FIDO.

### В каких операционных системах поддержка ключей доступа реализована хуже всего и требует дополнительной обработки при реализации WebAuthn?

Windows 10 и Linux обеспечивают наименьшую поддержку ключей доступа, поэтому для пользователей этих платформ требуются специальные резервные решения. Мониторинг сбоев WebAuthn на стороне клиента и отклонений проверки сервером как отдельных потоков помогает выявлять проблемы, специфичные для ОС, в производственной среде.
