Аутентификация
Стартер использует Auth.js v5 (next-auth@5) с адаптером Prisma и стратегией сессий JWT
(она обязательна для провайдера Credentials — сессии в базе данных с Credentials несовместимы).
Два файла конфигурации
src/auth.config.ts— edge-safe часть: никаких импортов Prisma/bcrypt/nodemailer. Именно её подключаетmiddleware.tsдля защиты маршрутов, потому что Edge Runtime не умеет работать с Node-специфичными модулями.src/auth.ts— полная конфигурация (Node runtime): адаптер Prisma и провайдерыCredentials(bcrypt) иNodemailer(magic-link).
Способы входа
Провайдеры включаются по наличию переменных окружения — если ключей нет, кнопка входа просто не отображается. Ничего не сломается, если вы не настроите ни один OAuth-провайдер: email/пароль работает всегда.
| Способ | Провайдер Auth.js | Переменные |
|---|---|---|
| Email + пароль | Credentials (bcrypt-хеш) | — работает без настройки |
| Magic-link | Nodemailer | EMAIL_FROM (+ SMTP_* для прод; в dev — лог-транспорт, см. «Почта») |
| Google | next-auth/providers/google | AUTH_GOOGLE_ID, AUTH_GOOGLE_SECRET |
| Яндекс | next-auth/providers/yandex | AUTH_YANDEX_ID, AUTH_YANDEX_SECRET |
| VK (legacy VK OAuth) | next-auth/providers/vk | AUTH_VK_ID, AUTH_VK_SECRET — выключен по умолчанию, см. ниже |
// src/auth.config.ts — провайдер добавляется только если оба ключа заданы
if (process.env.AUTH_GOOGLE_ID && process.env.AUTH_GOOGLE_SECRET) {
providers.push(
Google({ clientId: process.env.AUTH_GOOGLE_ID, clientSecret: process.env.AUTH_GOOGLE_SECRET }),
);
}
Настройка AUTH_SECRET и AUTH_URL
# сгенерировать секрет для подписи JWT/сессий
npx auth secret
# или
openssl rand -base64 32
AUTH_SECRET="<сгенерированное значение>"
AUTH_URL="https://your-domain.ru" # в проде — реальный домен; в dev — http://localhost:3000
Настройка Google OAuth
- В Google Cloud Console создайте OAuth client ID типа Web application.
- Authorized redirect URI:
https://your-domain.ru/api/auth/callback/google(в dev —http://localhost:3000/api/auth/callback/google). - Скопируйте Client ID / Client Secret в
AUTH_GOOGLE_ID/AUTH_GOOGLE_SECRET.
Настройка Яндекс OAuth
- Зарегистрируйте приложение в Яндекс OAuth.
- Платформа — веб-сервисы, redirect URI:
https://your-domain.ru/api/auth/callback/yandex. - Запросите доступ к базовым правам (email, имя пользователя).
- Скопируйте Client ID / Client Secret в
AUTH_YANDEX_ID/AUTH_YANDEX_SECRET.
VK: почему выключен по умолчанию
Встроенный провайдер next-auth/providers/vk в Auth.js v5 существует и подключён в код, но
нацелен на устаревший VK OAuth (oauth.vk.com, API версии 5.126), а не на новый VK ID
(id.vk.com), на который VK переводит новые приложения. Поэтому VK не входит в набор по
умолчанию — код готов, но требует ваших собственных ключей и проверки, что legacy-эндпоинты
всё ещё работают для вашего приложения:
AUTH_VK_ID=""
AUTH_VK_SECRET=""
Если вам нужна интеграция именно с VK ID — встроенный провайдер под неё не рассчитан; либо
реализуйте кастомный OIDC/OAuth-провайдер против id.vk.com (Auth.js это позволяет), либо
дождитесь обновления пакета.
Защита маршрутов
src/middleware.ts использует edge-safe колбэк authConfig.callbacks.authorized: любой путь под
/dashboard/** требует активной сессии, иначе — редирект на /login. Всё остальное открыто.
authorized({ auth, request: { nextUrl } }) {
const isLoggedIn = Boolean(auth?.user);
const isProtected = nextUrl.pathname.startsWith('/dashboard');
if (isProtected) return isLoggedIn;
return true;
}
В серверных компонентах и route handlers дополнительно доступен помощник requireUser() из
src/lib/auth-helpers.ts — он бросает редирект/ошибку, если сессии нет, вместо ручной проверки
auth() в каждом обработчике.
Сессия: что попадает в JWT
Колбэки jwt и session прокидывают user.id из базы данных в токен и обратно в объект
session.user.id, чтобы серверные компоненты и API-роуты могли обращаться к session.user.id
без дополнительного похода в базу.
Страницы
/login— форма входа (email/пароль + кнопки включённых OAuth-провайдеров)./register— регистрация по email/паролю./verify-request— страница «проверьте почту» после запроса magic-link./dashboard— защищённая зона, доступна только авторизованным пользователям.