
🔐 Изучайте аутентификацию, создавая её правильно. Расширяемая, соответствующая стандартам эталонная реализация для Cloudflare Workers с Hono, Turso, PBKDF2 и JWT-сессиями с двойными токенами.
Изучайте аутентификацию, создавая её правильно.
Примечание к демо: Конечная точка входа защищена адаптивными PoW-задачами — повторные неудачи увеличивают сложность доказательства работы. Ограничение частоты запросов на основе кэша реализовано и протестировано, но в данный момент не включено в демо-версии; для активации переключите
createCacheClientвapp.ts.
Эталонная реализация аутентификации с нуля для Cloudflare Workers — хеширование паролей PBKDF2, JWT-сессии с двумя токенами, сравнение за константное время, скользящее истечение и подключаемый плагин наблюдаемости — всё собрано с Hono, Turso (с опциональным кэшированием Valkey/Redis) и строгим TypeScript.
Каждое проектное решение опирается на стандарт: NIST SP 800-63B для учётных данных, NIST SP 800-132 для вывода ключей, OWASP ASVS для верификации и RFC 8725 для лучших практик JWT.
Создаёте продукт? Используйте Better Auth — он покрывает OAuth, passkey, MFA, ограничение частоты запросов и многое другое из коробки с активной экосистемой плагинов. Этот репозиторий существует, чтобы научить вас как работает аутентификация, а не заменять production-библиотеку.
Этот проект намеренно опускает функции, выходящие за рамки его образовательной цели. Если вы расширяете этот код в сторону продакшена (или оцениваете, что требуется для production-системы аутентификации), таблицы ниже группируют пробелы по уровням приоритета.
В большинстве реальных проектов используйте Better Auth вместо создания собственного решения.
| Функция | Почему это важно | Стандарт / Ссылка |
|---|---|---|
| Проверка скомпрометированных паролей | Предотвращает использование паролей, известных из публичных утечек | NIST SP 800-63B §5.1.1.2, HIBP API |
Все это отличные причины обратиться к Better Auth вместо самостоятельной реализации.
.
├── apps/
│ └── cloudflare-workers/ # Пример Worker + Hono маршруты
├── packages/
│ ├── core/ # Сервисы аутентификации, middleware, утилиты криптографии
│ ├── infrastructure/ # Клиент БД + утилиты
│ ├── observability/ # Генерация событий, адаптивные задачи, ops API (удаляемый плагин)
│ ├── schemas/ # Zod-схемы
│ └── types/ # Общие типы TypeScript
├── tools/
│ └── cli/ # plctl — Go TUI для поверхности /ops
└── docs/
├── adr/ # Записи архитектурных решений
└── audits/ # Аудиты безопасности
git clone https://github.com/vhscom/private-landing.git
cd private-landing
bun install
bun run dev
Всё — никаких учётных записей, ключей API или файлов .env. Dev-сервер запускается с локальной SQLite-базой и сгенерированными секретами. Откройте http://localhost:8788, чтобы зарегистрировать аккаунт и изучить потоки аутентификации.
Есть аккаунт Turso? Поместите файл
.dev.varsвapps/cloudflare-workers/(см..dev.vars.example), иbun run devавтоматически использует wrangler с вашей удалённой базой. Используйтеbun run dev:local, чтобы в любом случае принудительно запустить локальный сервер.
Инструкции по тестированию и развёртыванию см. в CONTRIBUTING.md.
Этот репозиторий включает файл CLAUDE.md, который предоставляет контекст для ИИ-ассистентов. При использовании Claude Code, Cursor или аналогичных инструментов разработки с поддержкой ИИ:
CLAUDE.md для контекста проектаdocs/adr/ объясняют дизайнерские выборыdocs/audits/ документируют состояние безопасностиКодовая база спроектирована для чтения ИИ: четкие границы модулей, всесторонние типы и описательные имена.
| Слой | Что делает |
|---|
| Хранение паролей | PBKDF2-SHA384 с 128-битными солями, дайджест целостности, контроль версий (password-service.ts) |
| Управление сессиями | Серверные сессии с отслеживанием устройств, скользящее истечение, ограничение максимум 3 на пользователя; опциональные сессии с кэшированием через Valkey/Redis (session-service.ts, cached-session-service.ts) |
| Смена пароля | Повторная верификация текущего пароля, полный перехеш PBKDF2, атомарный отзыв всех сессий (account-service.ts, ADR-004) |
| JWT с двумя токенами | Токен доступа на 15 мин + токен обновления на 7 дней, привязаны к сессии для отзыва (token-service.ts) |
| Middleware аутентификации | Автоматический поток обновления, явная привязка HS256, проверка утверждения typ (require-auth.ts) |
| Безопасные куки | HttpOnly, Secure, SameSite=Strict, Path=/ (cookie.ts) |
| Заголовки безопасности | HSTS, CSP, CORP/COEP/COOP, Permissions-Policy, удаление отпечатков (security.ts) |
| Валидация входных данных | Zod-схемы с NIST-совместимой политикой паролей (только длина, без правил сложности) |
| Ограничение частоты запросов | Фиксированное окно для защиты от атак перебором и подбором учётных данных: по IP на публичных маршрутах аутентификации (например, вход), по пользователю на защищённых действиях; без жёстких блокировок (согласно NIST) (ADR-006) |
| Плагин наблюдаемости | Структурированные события безопасности, адаптивные PoW-задачи, агент-аутентифицированное API /ops — подключается через middleware, удаляется удалением одного пакета (ADR-008) |
| Инструменты CLI | Go TUI (plctl) для запроса событий, управления сессиями и предоставления учётных данных агента через поверхность /ops (tools/cli/) |
| Тесты векторов атак | Подделка JWT, путаница алгоритмов, путаница типов, граничные случаи Unicode, проверки раскрытия информации |
| Функция | Почему это важно | Стандарт / Ссылка |
|---|
| CSRF-защита (если SameSite ослаблен) | SameSite=Strict в настоящее время предотвращает CSRF; при изменении на Lax для удобства пользователей потребуется явный токен | OWASP CSRF Cheat Sheet |
| Ротация токенов обновления | Обнаруживает кражу токена — если повторить ротированный токен обновления, отозвать всю семью сессий | RFC 6819 §5.2.2.3 |
Утверждение aud в JWT | Предотвращает принятие токена от одного сервиса другим, использующим тот же секрет | RFC 7519 §4.1.3, RFC 8725 §3.9 |
| CSP nonce для встроенных скриптов | Текущий CSP использует 'unsafe-inline'; nonce устраняют векторы XSS через встроенные скрипты | MDN CSP script-src |
| Функция | Почему это важно | Стандарт / Ссылка |
|---|
| Многофакторная аутентификация TOTP | Добавляет второй фактор для ценных аккаунтов | RFC 6238, NIST SP 800-63B §5.1.4 |
| WebAuthn / passkey | Устойчивая к фишингу аутентификация с использованием платформенных аутентификаторов | WebAuthn Level 2 |
| OAuth / вход через соцсети | Снижает трение, уменьшает утомление от паролей | RFC 6749 |
| Magic-ссылки / OTP | Беспарольный вариант для низкорисковых потоков | NIST SP 800-63B §5.1.3 |
| Аналитика сессий | Отслеживание устройств, видимость параллельных сессий, обнаружение аномалий | OWASP Session Management Cheat Sheet |
| Ротация ключей подписи | Позволяет периодически менять секреты без аннулирования всех сессий | RFC 7517 (JWK) |
| Функция | Почему это важно | Стандарт / Ссылка |
|---|
| DPoP / привязка токена | Привязывает токены к TLS-соединению клиента, предотвращая повторное использование при эксфильтрации | RFC 9449 (DPoP) |
| Мультитенантность | Изолирует пулы пользователей, секреты и политики для каждого арендатора | Специфично для приложения |
| Геоограничение / репутация IP | Блокирует вход из неожиданных регионов или заведомо плохих IP | OWASP ASVS v5.0 §6.3.5 |
| Адаптивная аутентификация | Повышает требования к аутентификации на основе сигналов риска (устройство, местоположение, поведение) | NIST SP 800-63B §6 |
| Обновление итераций PBKDF2 или Argon2id | OWASP рекомендует 210 000 итераций PBKDF2-SHA512 (Cloudflare ограничивает 100 000); Argon2id защищен памятью | OWASP Password Storage Cheat Sheet |