главное в кибербезопасности Читать в канале
Технологии 11 октября 2026 3 мин

Passkeys заменили пароли в FastAPI и Next.js: полный код для внедрения

Passkeys заменяют пароли в FastAPI и Next.js

Passkeys представляют собой стандарт аутентификации, основанный на асимметричных криптографических ключах. Они обеспечивают более высокий уровень безопасности и удобства по сравнению с традиционными паролями. Технически Passkeys реализуют стандарт WebAuthn (W3C) из семейства протоколов FIDO2. Основной принцип работы заключается в использовании пары ключей: приватный ключ хранится на устройстве пользователя в защищенном анклаве и никогда не покидает его, а публичный ключ отправляется на сервер при регистрации и сохраняется в базе данных. При аутентификации сервер отправляет случайный вызов (challenge), который устройство подписывает приватным ключом после подтверждения биометрией. Сервер затем проверяет эту подпись с помощью публичного ключа. Таким образом, пароль никогда не передается по сети.

Синхронизация Passkeys между устройствами происходит автоматически через облачные сервисы, такие как iCloud Keychain для Apple или Google Password Manager для Android. Эта функция называется Discoverable Credentials, позволяющая устройству автоматически определять доступные ключи для конкретного сайта. Важно отметить, что Passkeys не заменяют токены JWT (JSON Web Tokens), а лишь заменяют процесс ввода логина и пароля. После успешной верификации Passkey бэкенд выдает стандартные JWT-токены, сохраняя привычный механизм авторизации.

Реализация Passkeys в стеке FastAPI и Next.js

Для внедрения Passkeys в веб-приложения используются две основные библиотеки: webauthn для бэкенда на Python (FastAPI) и @simplewebauthn/browser для фронтенда на TypeScript (Next.js). Библиотека webauthn упрощает генерацию вызовов (challenge), верификацию ответов и работу с бинарными форматами данных, необходимыми для стандарта WebAuthn. Библиотека @simplewebauthn/browser служит оберткой над navigator.credentials и автоматически обрабатывает преобразование между ArrayBuffer и base64url, избавляя разработчика от рутинных операций с WebCrypto API.

База данных для хранения информации о Passkeys состоит из двух таблиц. Таблица webauthn_credentials хранит уникальный идентификатор ключа (credential_id), публичный ключ (public_key), счетчик подписей (sign_count), информацию о транспорте (transports) и название устройства (device_name). Счетчик подписей используется для обнаружения случаев клонирования ключа. Таблица webauthn_challenges предназначена для хранения одноразовых вызовов (challenge), которые генерируются перед каждой операцией регистрации или аутентификации и удаляются после использования. Для хранения вызовов выбрана PostgreSQL, поскольку они малочисленны, малы по размеру и имеют короткий срок жизни, что делает обычную таблицу достаточной для большинства сценариев. При необходимости, для увеличения производительности, эту таблицу можно легко перенести в Redis.

Серверная часть приложения требует настройки трех переменных окружения: WEBAUTHN_RP_ID (домен сервиса), WEBAUTHN_RP_NAME (имя приложения, отображаемое пользователю) и WEBAUTHN_RP_ORIGIN (полный URL фронтенда для проверки). Для локальной разработки используются соответствующие значения, например, localhost и http://localhost:3000. Для обработки ошибок авторизации определены кастомные исключения, такие как WebAuthnError, PasskeyNotFoundError и UserNotFoundError, которые возвращают соответствующие HTTP-статусы.

Безопасность и удобство использования Passkeys

Passkeys обеспечивают значительное повышение безопасности за счет устранения необходимости в паролях, которые часто становятся целью фишинговых атак и утечек данных. Использование биометрической аутентификации или аппаратных ключей в сочетании с криптографическими парами ключей делает процесс входа более надежным. Приватный ключ, хранящийся в защищенном анклаве устройства, никогда не покидает его, что исключает возможность его кражи при передаче по сети. Счетчик подписей (sign_count) в таблице webauthn_credentials служит дополнительным механизмом защиты от атак повторного воспроизведения и клонирования ключей. Если при аутентификации сервер получает sign_count меньше сохраненного, это сигнализирует о потенциальной проблеме с ключом.

С точки зрения удобства, Passkeys упрощают процесс входа для пользователей. Им не нужно запоминать сложные пароли или проходить процедуру их восстановления. Автоматическая синхронизация ключей между устройствами пользователя через облачные сервисы также добавляет комфорта. Приложение может использовать информацию о транспорте (transports), чтобы предложить пользователю наиболее подходящий способ аутентификации, например, Face ID для встроенных аутентификаторов или USB для аппаратных ключей. Внедрение Passkeys позволяет сервисам соответствовать современным стандартам безопасности и улучшить пользовательский опыт, делая аутентификацию быстрее и безопаснее.

Источник