Интеграция входа через Google в Next.js с помощью NextAuth
Зачем нужна правильная аутентификация
Интеграция безопасной системы аутентификации — ключевой этап разработки. Она защищает данные пользователей и гарантирует доступ только авторизованным лицам. Построение надёжной системы «с нуля» отнимает много времени и требует знаний протоколов (OAuth2, OpenID Connect). NextAuth позволяет сосредоточиться на бизнес‑логике, взяв на себя большую часть протоколов и интеграций.
Как работает NextAuth
NextAuth.js — это библиотека с открытым исходным кодом для аутентификации в приложениях Next.js. Она упрощает добавление аутентификации и авторизации, поддерживает email-подключение, passwordless, а также провайдеров: Google, GitHub, Facebook и другие.
В общих чертах NextAuth выступает посредником между вашим приложением и провайдером аутентификации. Когда пользователь кликает «войти через Google», его перенаправляют на страницу входа Google. После успешной аутентификации Google возвращает полезную нагрузку с информацией о пользователе (имя, email и т. п.). NextAuth принимает эти данные, создаёт сессию и сохраняет токен сессии в HTTP-only cookie. При последующих запросах этот токен подтверждает, что пользователь аутентифицирован.
Процесс похож и для других провайдеров, с незначительными отличиями в данных и реализации.
Регистрация приложения в Google Developer Console
Чтобы приложение могло использовать Google для входа, оно должно быть зарегистрировано в Google Developer Console. В результате вы получите Client ID и Client Secret — обязательные параметры для настройки провайдера.
Перейдите в Google Developer Console и войдите в свой аккаунт Google.
Создайте новый проект.
На странице проекта откройте раздел «APIs and Services» → «Credentials».
Нажмите «Create Credentials» и выберите OAuth client ID. Укажите тип приложения (например, Web application) и задайте имя.
Укажите URL вашего приложения и авторизованный redirect URI. Для локальной разработки NextAuth ожидает URI вида:
http://localhost:3000/api/auth/callback/googleПосле регистрации вы получите Client ID и Client Secret — сохраните их для конфигурации приложения.
Настройка проекта Next.js
Создайте новый Next.js проект локально (или откройте существующий):
npx create-next-app next-auth-appПерейдите в каталог проекта и запустите dev‑сервер:
npm run devОткройте http://localhost:3000 — должно отображаться стартовое приложение Next.js.
Настройка файла окружения
В корне проекта создайте файл .env.local (локально) и добавьте туда значения из Google Console. Рекомендуется не помечать секреты как NEXT_PUBLIC, чтобы не случайно сделать их доступными в клиентском бандле.
GOOGLE_CLIENT_ID=your-client-id.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=your-client-secret
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=some-random-secretВажно: храните реальные секреты вне системы контроля версий (например, в .gitignore) и используйте менеджер секретов на продакшне.
Установка и базовая интеграция NextAuth
Установите библиотеку NextAuth:
npm install next-authСоздайте API-роут для NextAuth: в папке /pages создайте /api/auth/[…nextauth].js с конфигурацией провайдеров.
import NextAuth from "next-auth";
import GoogleProvider from "next-auth/providers/google";
export default NextAuth({
providers: [
GoogleProvider({
clientId: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
}),
],
secret: process.env.NEXTAUTH_SECRET,
});Этот файл настраивает Google как провайдера и использует переменные окружения для Client ID/Secret.
Подключение SessionProvider
Откройте pages/_app.js и оберните приложение в SessionProvider, чтобы состояние сессии было доступно в любом компоненте.
import '../styles/globals.css'
import { SessionProvider } from "next-auth/react"
function MyApp({ Component, pageProps: { session, ...pageProps } }) {
return (
)
}
export default MyAppSessionProvider предоставляет данные сессии (session) по всему приложению.
Пример простой страницы входа (pages/index.js)
Ниже — сокращённый пример, где кнопка ведёт на страницу /Login.
import Head from 'next/head'
import styles from '../styles/Home.module.css'
import { useRouter } from 'next/router'
export default function Home() {
const router = useRouter();
return (
Create Next App
Welcome to Next.js!
Get started by signing in with your Google Account
)
}Страница Login (pages/Login.js)
Пример использования хуков next-auth: useSession, signIn и signOut.
import { useSession, signIn, signOut } from 'next-auth/react'
import { useRouter } from 'next/router'
import styles from '../styles/Login.module.css'
export default function Login() {
const { data: session } = useSession()
const router = useRouter();
if (session) {
return (
Create Next App
Signed in as {session.user.email}
)
}
return (
Create Next App
You are not signed in
)
}useSession предоставляет объект session с информацией о пользователе (id, email, имя и т. д.). signIn/ signOut запускают процессы входа/выхода через подключённые провайдеры.
Сохранение данных пользователя и серверная аутентификация
NextAuth поддерживает интеграции с базами данных (PostgreSQL, MySQL и др.) через адаптеры. Если вам нужно хранить пользователей и токены, подключите базу данных и адаптер (например, Prisma).
Пример сценария: при первом входе NextAuth создаёт запись пользователя в базе, при последующих запросах сервер возвращает сессию и вы можете валидировать права доступа на бекенде.
Безопасность и лучшие практики
Important: по умолчанию не делайте секреты доступными в клиентской части (без NEXT_PUBLIC). Используйте .env.local на локальной машине и защищённое хранилище секретов в продакшне.
Рекомендации по безопасности:
- Храните NEXTAUTH_SECRET и клиентские секреты в защищённом менеджере секретов.
- Используйте HTTPS в продакшне и корректные значения NEXTAUTH_URL.
- Ограничьте OAuth-redirect URIs только доверенными доменами.
- Настройте срок жизни сессий и rotation токенов при необходимости.
- Если используете JWT, подпишите их надёжным секретом и рефрешите регулярно.
Конфиденциальность и соответствие требованиям (GDPR)
Notes: при интеграции сторонних провайдеров учитывайте, какие пользовательские данные вы запрашиваете и храните. Для GDPR/локальных законов:
- Документируйте какие поля профиля вы сохраняете.
- Предоставьте пользователю возможность удалить данные («право на забвение»).
- Обеспечьте обработку запросов данных/копий по запросу пользователя.
- Для аналитики анонимизируйте личные данные.
Если вы передаёте данные в сторонние сервисы (Google), отразите это в политике конфиденциальности.
Отладка и типичные ошибки
Когда интеграция не работает: чек-лист для локальной отладки
- Проверьте, что redirect URI в Google Console точно совпадает с http(s)://…/api/auth/callback/google
- Убедитесь, что переменные окружения доступны процессу (перезапустите dev-сервер после изменений в .env.local)
- Посмотрите лог сервера Next.js на предмет ошибок в […nextauth].js
- Проверьте, не попадают ли секреты в клиентский бандл (использование NEXTPUBLIC)
- Если ошибка CORS — проверьте настройки Google API и домены
Примеры сообщений и причины:
- invalid_client — Client ID/Secret указаны неверно.
- redirect_uri_mismatch — Redirect URI не совпадает с указанным в Google Console.
- insufficient_scope — запрошены недоступные scope.
Альтернативные подходы
Если вы не хотите управлять OAuth-конфигурацией самостоятельно, рассмотрите готовые сервисы:
- Auth0 — полностью управляемый сервис аутентификации с поддержкой социальных логинов.
- Firebase Authentication — простая интеграция с Google, Apple, Email и др.
- Clerk — современный сервис аутентификации с UI-компонентами.
Плюсы NextAuth: бесплатен, открыт, гибок, хорошо интегрируется с Next.js. Плюсы SaaS-решений: меньше поддержки, встроенные UI, SOC/SLA у провайдера.
Мини‑методология внедрения (шаги)
- Зарегистрировать приложение в Google Console и получить Client ID/Secret.
- Добавить значения в .env.local и перезапустить проект.
- Установить next-auth и создать /api/auth/[…nextauth].js.
- Обернуть приложение в SessionProvider и реализовать страницы входа/профиля.
- Протестировать локально и в staging (HTTPS), затем разворачивать на продакшн.
- Подключить базу данных при необходимости и настроить адаптер.
Роль‑ориентированные чек-листы
Для разработчика:
- Получил Client ID и Client Secret
- Создал .env.local и не залил в git
- Настроил /api/auth/[…nextauth].js
- Тесты на вход/выход проходят
Для DevOps:
- Настроены секреты в системе CI/CD
- Конфигурация NEXTAUTH_URL для среды
- HTTPS и хедеры безопасности настроены
Для продакт‑менеджера:
- Уточнил набор полей пользователя для хранения
- Проверил требования к хранению данных и согласие пользователя
Тесты и критерии приёмки
Критерии приёмки:
- Авторизация через Google работает (редирект → подтверждение → успешный вход)
- При входе создаётся/обновляется запись пользователя в БД (если предусмотрено)
- Сессия доступна на клиенте и защищена cookie HTTP-only
- Выход корректно инвалидирует сессию
Минимальные тесты:
- Попытка входа с некорректным clientId даёт ошибку invalid_client
- Попытка редиректа на недопустимый URI — redirect_uri_mismatch
- Проверка наличия email в session.user при успешном входе
Чит‑шит: команды и полезные фрагменты
- Создать проект: npx create-next-app my-app
- Установить NextAuth: npm install next-auth
- Запуск: npm run dev
- Пример провайдера: GoogleProvider({ clientId, clientSecret })
Полезные ссылки (официальная документация):
Безопасность: hardening
- Используйте CSP и Secure/HttpOnly флаги для cookie.
- Ограничьте время жизни сессии и используйте ротацию токенов.
- Минимизируйте scope, запрашивая только необходимые данные от провайдера.
- Разделяйте роли: минимальные привилегии для сервисных учётных записей.
Когда такой подход не подходит
Counterexamples:
- Если вам требуются расширенные возможности SSO для корпоративного окружения (SAML, SCIM), готовые решения и провайдеры корпоративной аутентификации могут быть предпочтительнее.
- Для приложений с жёсткими требованиями к SLA и поддержке 24/7 можно выбрать управляемый сервис.
Короткая галерея крайних случаев
- Локальная разработка без HTTPS — возможны ошибки при некоторых провайдерах; тестируйте на staging с HTTPS.
- Мульти‑доменная конфигурация требует точной настройки redirect URI для каждого домена.
Сравнение в один абзац
NextAuth — отличное решение для большинства Next.js проектов, где важна гибкость и отсутствие привязки к коммерческому сервису. SaaS‑решения дают удобство, поддержку и UI‑компоненты «из коробки», но стоят денег и ограничивают контроль.
Краткое резюме
NextAuth значительно упрощает добавление Google‑входа в Next.js: от регистрации приложения в Google до обработки сессий в приложении. Следуйте рекомендациям по безопасности, храните секреты вне репозитория и тестируйте redirect URI. При специальных требованиях рассмотрите управляемые сервисы.
FAQ
Q: Где хранить Client Secret на продакшне? A: В менеджере секретов вашей облачной платформы (AWS Secrets Manager, Azure Key Vault, Vercel Secrets и т. п.).
Q: Нужно ли помечать clientId как NEXTPUBLIC*? A: Нет, clientId можно и оставить доступным серверу; секреты (clientSecret) не должны быть публичными.
Q: Могу ли я хранить пользователей в PostgreSQL? A: Да — NextAuth поддерживает адаптеры (например, для Prisma) для хранения пользователей и сессий.
Однострочный глоссарий
- OAuth2 — протокол авторизации, позволяющий приложениям получать доступ к ресурсам от имени пользователя.
- OpenID Connect — надстройка над OAuth2 для аутентификации и получения информации о пользователе.
- Provider — внешний сервис, предоставляющий идентификацию (например, Google).
- Session — объект, описывающий аутентифицированный сеанс пользователя.
Похожие материалы
Градиенты в Canva: добавить и настроить
Ошибка Disabled accounts can't be contacted в Instagram
Генерация случайных чисел в Google Sheets
Прокручиваемые скриншоты в Windows 11
Как установить корпусной вентилятор в ПК