Skip to content

vamischenko/app_auth

Repository files navigation

Laravel - Система множественной авторизации

Комплексный проект, демонстрирующий 11 различных методов авторизации в Laravel, включая внутренние механизмы и бесплатные OAuth провайдеры (в том числе российские).


📋 Содержание


🎯 Реализованные методы авторизации

Внутренняя авторизация (5 методов)

  1. ✅ Email/Password (Laravel Breeze)

    • Стандартная регистрация с email и паролем
    • Восстановление забытого пароля
    • Bcrypt хеширование (12 rounds)
  2. ✅ Email Verification

    • Подтверждение email адреса при регистрации
    • Защита маршрутов через middleware verified
    • Повторная отправка письма подтверждения
  3. ✅ Remember Me

    • Функция "Запомнить меня" для длительных сессий
    • Secure cookie на 400 дней
    • Чекбокс на странице входа
  4. ✅ Two-Factor Authentication (2FA/TOTP)

    • Двухфакторная аутентификация с Google Authenticator / Authy
    • Генерация QR-кода для настройки
    • Проверка 6-значного TOTP кода
    • 8 одноразовых recovery кодов для восстановления доступа
    • Возможность включения/выключения в профиле
  5. ✅ Magic Link

    • Вход без пароля по одноразовой ссылке из email
    • Ссылка действительна 30 минут
    • Автоматический вход при переходе по ссылке
    • Защита от повторного использования

OAuth провайдеры (6 провайдеров)

  1. ✅ Google OAuth

    • Авторизация через Google аккаунт
    • Получение имени, email, аватара
    • Автоматическая верификация email
  2. ✅ GitHub OAuth

    • Авторизация через GitHub аккаунт
    • Получение username, email, аватара
    • Идеально для разработчиков
  3. ✅ Facebook OAuth

    • Авторизация через Facebook аккаунт
    • Получение имени, email, аватара
    • Международная социальная сеть
  4. ✅ VKontakte (VK) OAuth

    • Авторизация через ВКонтакте
    • Российская социальная сеть
    • Бесплатный API
  5. ✅ Yandex OAuth

    • Авторизация через Яндекс
    • Российский поисковик и портал
    • Получение email и аватара
  6. ✅ Mail.ru OAuth

    • Авторизация через Mail.ru
    • Российский email провайдер
    • Интеграция с социальной сетью

🔧 Требования

  • PHP: 8.3 или выше
  • Composer: последняя версия
  • MySQL: 5.7 или выше
  • Node.js: 20.19+ или 22.12+
  • npm: последняя версия

🚀 Быстрый старт

Минимальная настройка для локального запуска (5 минут):

1. Создайте базу данных MySQL

mysql -u root -p
CREATE DATABASE different_auths CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
EXIT;

2. Установите зависимости

# Composer зависимости
composer install

# NPM зависимости
npm install

3. Настройте .env файл

# Скопируйте .env.example в .env (если не сделано автоматически)
cp .env.example .env

# Отредактируйте параметры базы данных
nano .env

Обновите следующие строки:

DB_DATABASE=different_auths
DB_USERNAME=root
DB_PASSWORD=ваш_пароль

4. Запустите миграции

# Генерация ключа приложения
php artisan key:generate

# Запуск миграций
php artisan migrate

5. Соберите фронтенд

npm run build

6. Запустите сервер

php artisan serve

Откройте браузер: http://localhost:8000


📦 Подробная установка

Автоматическая установка

Используйте скрипт для автоматической установки:

chmod +x COMMANDS.sh
./COMMANDS.sh

Ручная установка

# 1. Клонирование репозитория (если применимо)
git clone <repository-url>
cd different_auths

# 2. Установка Composer зависимостей
composer install

# 3. Установка NPM зависимостей
npm install

# 4. Создание .env файла
cp .env.example .env

# 5. Генерация ключа
php artisan key:generate

# 6. Настройка базы данных в .env
# Отредактируйте DB_DATABASE, DB_USERNAME, DB_PASSWORD

# 7. Создание базы данных
mysql -u root -p
CREATE DATABASE different_auths;
EXIT;

# 8. Запуск миграций
php artisan migrate

# 9. Сборка frontend
npm run build

# 10. Очистка кеша
php artisan cache:clear
php artisan config:clear

# 11. Запуск сервера
php artisan serve

🔐 Настройка OAuth провайдеров

Для работы OAuth авторизации необходимо получить Client ID и Client Secret для каждого провайдера.

Google OAuth

  1. Перейдите в Google Cloud Console
  2. Создайте новый проект или выберите существующий
  3. Перейдите в "APIs & Services" → "Credentials"
  4. Нажмите "Create Credentials" → "OAuth 2.0 Client ID"
  5. Настройте OAuth consent screen (если требуется)
  6. Выберите "Web application"
  7. Добавьте Authorized redirect URIs:
    http://localhost:8000/auth/google/callback
    
  8. Скопируйте Client ID и Client Secret
  9. Добавьте в .env:
GOOGLE_CLIENT_ID=ваш_client_id
GOOGLE_CLIENT_SECRET=ваш_client_secret
GOOGLE_REDIRECT_URL=http://localhost:8000/auth/google/callback

GitHub OAuth

  1. Перейдите в GitHub Developer Settings
  2. Нажмите "New OAuth App"
  3. Заполните форму:
    • Application name: Different Auths
    • Homepage URL: http://localhost:8000
    • Authorization callback URL: http://localhost:8000/auth/github/callback
  4. Нажмите "Register application"
  5. Скопируйте Client ID
  6. Сгенерируйте Client Secret
  7. Добавьте в .env:
GITHUB_CLIENT_ID=ваш_client_id
GITHUB_CLIENT_SECRET=ваш_client_secret
GITHUB_REDIRECT_URL=http://localhost:8000/auth/github/callback

Facebook OAuth

  1. Перейдите в Facebook Developers
  2. Создайте новое приложение
  3. Выберите тип "Consumer"
  4. Добавьте продукт "Facebook Login"
  5. В настройках Facebook Login добавьте Valid OAuth Redirect URIs:
    http://localhost:8000/auth/facebook/callback
    
  6. В Settings → Basic скопируйте App ID и App Secret
  7. Добавьте в .env:
FACEBOOK_CLIENT_ID=ваш_app_id
FACEBOOK_CLIENT_SECRET=ваш_app_secret
FACEBOOK_REDIRECT_URL=http://localhost:8000/auth/facebook/callback

VKontakte OAuth

  1. Перейдите в VK Developers
  2. Создайте приложение
  3. Выберите тип "Веб-сайт"
  4. Укажите адрес сайта: http://localhost:8000
  5. В настройках добавьте Authorized redirect URI:
    http://localhost:8000/auth/vkontakte/callback
    
  6. Включите доступ к email в разделе "Права доступа"
  7. Скопируйте ID приложения и Защищённый ключ
  8. Добавьте в .env:
VKONTAKTE_CLIENT_ID=ваш_app_id
VKONTAKTE_CLIENT_SECRET=ваш_secure_key
VKONTAKTE_REDIRECT_URL=http://localhost:8000/auth/vkontakte/callback

Yandex OAuth

  1. Перейдите в Yandex OAuth
  2. Нажмите "Зарегистрировать новое приложение"
  3. Заполните форму:
    • Название: Different Auths
    • Платформы: Веб-сервисы
    • Callback URI: http://localhost:8000/auth/yandex/callback
  4. В разделе "Доступ к данным" отметьте:
    • Доступ к email адресу
    • Доступ к аватару
    • Доступ к логину
  5. Создайте приложение
  6. Скопируйте ID и Пароль
  7. Добавьте в .env:
YANDEX_CLIENT_ID=ваш_client_id
YANDEX_CLIENT_SECRET=ваш_client_secret
YANDEX_REDIRECT_URL=http://localhost:8000/auth/yandex/callback

Mail.ru OAuth

  1. Перейдите в Mail.ru OAuth
  2. Создайте новое приложение
  3. Заполните форму:
    • Название: Different Auths
    • Redirect URI: http://localhost:8000/auth/mailru/callback
  4. В разделе "Права доступа" отметьте нужные права
  5. Создайте приложение
  6. Скопируйте ID и Secret
  7. Добавьте в .env:
MAILRU_CLIENT_ID=ваш_client_id
MAILRU_CLIENT_SECRET=ваш_client_secret
MAILRU_REDIRECT_URL=http://localhost:8000/auth/mailru/callback

📧 Настройка Email

Для работы Magic Link и Email Verification требуется настройка отправки email.

Вариант 1: Log Driver (для разработки)

Письма будут сохраняться в лог файл storage/logs/laravel.log:

MAIL_MAILER=log

Просмотр писем в реальном времени:

tail -f storage/logs/laravel.log

Вариант 2: Mailtrap (рекомендуется для тестирования)

  1. Зарегистрируйтесь на Mailtrap.io
  2. Создайте новый inbox
  3. Скопируйте SMTP credentials
  4. Добавьте в .env:
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=ваш_username
MAIL_PASSWORD=ваш_password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="noreply@example.com"
MAIL_FROM_NAME="${APP_NAME}"

Вариант 3: Реальный SMTP сервер

Для production используйте настоящий SMTP сервер:

MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=ваш_email@gmail.com
MAIL_PASSWORD=ваш_пароль_приложения
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="noreply@yourdomain.com"
MAIL_FROM_NAME="${APP_NAME}"

💡 Использование

Основные маршруты

После запуска сервера доступны следующие страницы:

  • / - Главная страница
  • /register - Регистрация нового пользователя
  • /login - Страница входа
  • /dashboard - Личный кабинет (требует авторизацию)
  • /profile - Редактирование профиля
  • /2fa/enable - Включение двухфакторной аутентификации
  • /magic-link - Запрос magic link для входа

OAuth маршруты

  • /auth/google - Авторизация через Google
  • /auth/github - Авторизация через GitHub
  • /auth/facebook - Авторизация через Facebook
  • /auth/vkontakte - Авторизация через VK
  • /auth/yandex - Авторизация через Yandex
  • /auth/mailru - Авторизация через Mail.ru

Использование 2FA

  1. Зарегистрируйтесь или войдите в систему
  2. Перейдите в Dashboard
  3. Нажмите кнопку "Enable 2FA"
  4. Установите Google Authenticator на телефон:
  5. Отсканируйте QR-код приложением или введите секретный ключ вручную
  6. Введите 6-значный код из приложения для подтверждения
  7. ВАЖНО: Сохраните recovery коды в безопасном месте!

При следующем входе после ввода email/пароля система запросит 2FA код.

Использование Magic Link

  1. На странице входа нажмите "Login with Magic Link"
  2. Введите ваш email адрес
  3. Проверьте почту (или лог файл, если используете log driver)
  4. Перейдите по ссылке из письма
  5. Вы автоматически войдёте в систему

Ссылка действительна 30 минут и может быть использована только один раз.

Использование OAuth

  1. На странице входа нажмите на кнопку нужного провайдера (Google, GitHub и т.д.)
  2. Вы будете перенаправлены на страницу провайдера
  3. Войдите в аккаунт провайдера (если не авторизованы)
  4. Разрешите доступ приложению
  5. Вы будете автоматически перенаправлены обратно и войдёте в систему

Если аккаунт с таким email уже существует, OAuth будет привязан к существующему аккаунту.


📂 Структура проекта

Контроллеры авторизации

app/Http/Controllers/Auth/
├── AuthenticatedSessionController.php  # Вход/выход (модифицирован для 2FA)
├── RegisteredUserController.php        # Регистрация (Breeze)
├── PasswordResetLinkController.php     # Восстановление пароля (Breeze)
├── SocialAuthController.php            # OAuth авторизация (новый)
├── TwoFactorController.php             # 2FA управление (новый)
└── MagicLinkController.php             # Magic Link авторизация (новый)

Модели

app/Models/
├── User.php                            # Расширен для OAuth и 2FA
└── MagicLink.php                       # Модель magic links (новая)

Миграции

database/migrations/
├── *_create_users_table.php                              # Стандартная
├── *_add_oauth_and_2fa_fields_to_users_table.php        # OAuth + 2FA поля
└── *_create_magic_links_table.php                       # Magic links таблица

Views

resources/views/
├── auth/
│   ├── login.blade.php                 # Страница входа (модифицирована)
│   ├── register.blade.php              # Регистрация (Breeze)
│   ├── two-factor/
│   │   ├── enable.blade.php            # Включение 2FA
│   │   ├── challenge.blade.php         # Ввод 2FA кода
│   │   └── recovery-codes.blade.php    # Показ recovery кодов
│   └── magic-link/
│       └── request.blade.php           # Запрос magic link
├── emails/
│   └── magic-link.blade.php            # Email шаблон magic link
└── dashboard.blade.php                 # Dashboard (модифицирован)

Конфигурация

config/
└── services.php                        # OAuth credentials (модифицирован)

🗄 База данных

Таблица users

CREATE TABLE users (
    id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE,
    email_verified_at TIMESTAMP NULL,
    password VARCHAR(255) NOT NULL,
    remember_token VARCHAR(100) NULL,

    -- OAuth поля
    oauth_provider VARCHAR(255) NULL,           -- google, github, facebook, vkontakte, yandex, mailru
    oauth_id VARCHAR(255) NULL,
    oauth_token TEXT NULL,
    oauth_refresh_token TEXT NULL,
    avatar VARCHAR(255) NULL,

    -- 2FA поля
    google2fa_enabled BOOLEAN DEFAULT FALSE,
    google2fa_secret VARCHAR(255) NULL,
    google2fa_recovery_codes TEXT NULL,         -- JSON array

    created_at TIMESTAMP NULL,
    updated_at TIMESTAMP NULL,

    INDEX idx_oauth (oauth_provider, oauth_id)
);

Таблица magic_links

CREATE TABLE magic_links (
    id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    email VARCHAR(255) NOT NULL,
    token VARCHAR(255) NOT NULL UNIQUE,
    expires_at TIMESTAMP NOT NULL,
    used_at TIMESTAMP NULL,
    created_at TIMESTAMP NULL,
    updated_at TIMESTAMP NULL,

    INDEX idx_email (email),
    INDEX idx_token (token)
);

🧪 Тестирование

Проверка Email/Password авторизации

# 1. Запустите сервер
php artisan serve

# 2. Откройте http://localhost:8000/register
# 3. Зарегистрируйте пользователя
# 4. Проверьте email верификацию в логах:
tail -f storage/logs/laravel.log

# 5. Войдите в систему через /login

Проверка 2FA

# 1. Войдите в систему
# 2. Откройте /dashboard
# 3. Нажмите "Enable 2FA"
# 4. Отсканируйте QR-код
# 5. Введите код из Google Authenticator
# 6. Сохраните recovery коды
# 7. Выйдите и войдите снова - потребуется 2FA код

Проверка Magic Link

# 1. Откройте /magic-link
# 2. Введите email
# 3. Проверьте лог:
tail -f storage/logs/laravel.log | grep -A 20 "Magic"

# 4. Скопируйте ссылку и откройте в браузере
# 5. Вы автоматически войдёте

Проверка OAuth (требует настройки)

# 1. Настройте OAuth credentials в .env
# 2. Откройте /login
# 3. Нажмите на кнопку нужного провайдера
# 4. Авторизуйтесь у провайдера
# 5. Разрешите доступ
# 6. Вы будете перенаправлены обратно

Проверка маршрутов

# Список всех маршрутов авторизации
php artisan route:list --path=auth
php artisan route:list --path=2fa
php artisan route:list --path=magic-link

Проверка базы данных

mysql -u root -p different_auths

# Проверка пользователей
SELECT id, name, email, oauth_provider, google2fa_enabled FROM users;

# Проверка magic links
SELECT email, created_at, expires_at, used_at FROM magic_links ORDER BY created_at DESC;

🔒 Безопасность

Реализованные меры безопасности

  • CSRF защита - Все формы защищены CSRF токенами
  • Bcrypt хеширование - Пароли хешируются с 12 rounds
  • Rate Limiting - Защита от брутфорса на странице входа
  • Email Verification - Обязательная верификация email
  • 2FA с TOTP - Стандартный TOTP алгоритм (RFC 6238)
  • Recovery коды - Одноразовые коды для восстановления доступа
  • Magic Link - Одноразовые токены с истечением (30 минут)
  • OAuth токены - Безопасное хранение, скрыты в API ответах
  • Session Security - Secure cookies, session regeneration
  • SQL Injection - Защита через Eloquent ORM и prepared statements
  • XSS - Защита через Blade template engine

Рекомендации для production

  1. HTTPS обязателен - Используйте SSL сертификат
  2. Смените APP_KEY - Используйте уникальный ключ
  3. Отключите DEBUG - Установите APP_DEBUG=false
  4. Настройте firewall - Ограничьте доступ к БД
  5. Логирование - Настройте мониторинг логов
  6. Backup - Регулярное резервное копирование БД
  7. OAuth Redirect URLs - Используйте production домены
  8. Rate Limiting - Настройте более строгие лимиты
  9. 2FA обязателен - Для администраторов обязательно
  10. Обновления - Регулярно обновляйте зависимости

📦 Установленные пакеты

Основные пакеты

{
  "require": {
    "php": "^8.3",
    "laravel/framework": "^12.44",
    "laravel/breeze": "^2.3",
    "laravel/socialite": "^5.24",
    "socialiteproviders/vkontakte": "^5.1",
    "socialiteproviders/yandex": "^4.1",
    "socialiteproviders/mailru": "^4.1",
    "pragmarx/google2fa-laravel": "^2.3"
  }
}

Описание пакетов

  • laravel/framework - Laravel framework
  • laravel/breeze - Стартовый набор для авторизации
  • laravel/socialite - OAuth провайдеры (Google, GitHub, Facebook)
  • socialiteproviders/vkontakte - VK OAuth провайдер
  • socialiteproviders/yandex - Yandex OAuth провайдер
  • socialiteproviders/mailru - Mail.ru OAuth провайдер
  • pragmarx/google2fa-laravel - Google 2FA (TOTP)

🎨 Интерфейс

  • Framework: Blade Templates
  • CSS: Tailwind CSS
  • Компоненты: Laravel Breeze UI Components
  • Адаптивный дизайн: Полностью responsive
  • Темная тема: Не реализована (можно добавить)

Основные страницы

  • Страница входа с OAuth кнопками
  • Страница регистрации
  • Dashboard с управлением 2FA
  • Страница включения 2FA с QR-кодом
  • Страница recovery кодов
  • Страница 2FA challenge
  • Страница запроса Magic Link
  • Страница профиля

🐛 Известные проблемы и решения

SQLite driver not found

Проблема: could not find driver (Connection: sqlite)

Решение: Проект настроен на MySQL. Убедитесь, что MySQL запущен и параметры в .env корректны.

OAuth не работает

Проблема: Ошибка при OAuth авторизации

Решение:

  1. Проверьте Client ID и Secret в .env
  2. Убедитесь, что callback URL совпадает с настройками у провайдера
  3. Проверьте, что провайдер зарегистрирован в AppServiceProvider

Magic Link не отправляется

Проблема: Email с magic link не приходит

Решение:

  1. Проверьте настройки MAIL_* в .env
  2. Если используете log driver, проверьте storage/logs/laravel.log
  3. Убедитесь, что пользователь с таким email существует

2FA QR-код не отображается

Проблема: Пустая страница или ошибка при включении 2FA

Решение:

# Проверьте, установлен ли пакет
composer show pragmarx/google2fa-laravel

# Если нет, установите
composer require pragmarx/google2fa-laravel

# Очистите кеш
php artisan cache:clear
php artisan config:clear

Migration ошибки

Проблема: Ошибки при запуске php artisan migrate

Решение:

# Откатите миграции
php artisan migrate:rollback

# Очистите БД
php artisan db:wipe

# Запустите заново
php artisan migrate

📞 Поддержка

Полезные команды

# Просмотр логов
tail -f storage/logs/laravel.log

# Очистка кеша
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear

# Проверка маршрутов
php artisan route:list

# Проверка миграций
php artisan migrate:status

# Создание нового пользователя через tinker
php artisan tinker
> User::create(['name' => 'Test', 'email' => 'test@example.com', 'password' => bcrypt('password'), 'email_verified_at' => now()]);

Полезные ссылки

Laravel документация:

OAuth провайдеры:

Пакеты:


📝 Чеклист функций

Что работает сразу после установки

  • Email/Password регистрация
  • Email/Password вход
  • Email Verification (через логи)
  • Remember Me
  • Восстановление пароля
  • 2FA с Google Authenticator
  • Magic Link (через логи)

Что требует настройки

  • Google OAuth (нужен Client ID/Secret)
  • GitHub OAuth (нужен Client ID/Secret)
  • Facebook OAuth (нужен Client ID/Secret)
  • VK OAuth (нужен Client ID/Secret)
  • Yandex OAuth (нужен Client ID/Secret)
  • Mail.ru OAuth (нужен Client ID/Secret)
  • Real Email (нужен SMTP сервер)

📄 Лицензия

Этот проект создан в образовательных целях и распространяется под MIT лицензией.


👨‍💻 Автор

Проект создан для демонстрации различных методов авторизации в Laravel 12.

Технологии: Laravel 12, PHP 8.3, MySQL, Tailwind CSS, Blade Templates

Дата создания: Декабрь 2025


🙏 Благодарности

  • Laravel Framework Team
  • Laravel Breeze Team
  • Laravel Socialite Team
  • SocialiteProviders Community
  • PragmaRX Google2FA

Начните с быстрого старта выше ↑ или изучите структуру проекта для понимания архитектуры.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages