Аутентификация

Стартер использует Auth.js v5 (next-auth@5) с адаптером Prisma и стратегией сессий JWT (она обязательна для провайдера Credentials — сессии в базе данных с Credentials несовместимы).

Два файла конфигурации

Способы входа

Провайдеры включаются по наличию переменных окружения — если ключей нет, кнопка входа просто не отображается. Ничего не сломается, если вы не настроите ни один 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

  1. В Google Cloud Console создайте OAuth client ID типа Web application.
  2. Authorized redirect URI: https://your-domain.ru/api/auth/callback/google (в dev — http://localhost:3000/api/auth/callback/google).
  3. Скопируйте Client ID / Client Secret в AUTH_GOOGLE_ID / AUTH_GOOGLE_SECRET.

Настройка Яндекс OAuth

  1. Зарегистрируйте приложение в Яндекс OAuth.
  2. Платформа — веб-сервисы, redirect URI: https://your-domain.ru/api/auth/callback/yandex.
  3. Запросите доступ к базовым правам (email, имя пользователя).
  4. Скопируйте 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 без дополнительного похода в базу.

Страницы