Laravel авторизация через Яндекс и Google: практическая реализация OAuth входа

mr. Cooper 2 дня назад Веб-разработка
Laravel авторизация через Яндекс и Google: практическая реализация OAuth входа

В современных веб-приложениях классическая регистрация через email и пароль постепенно дополняется входом через внешние сервисы. Это ускоряет онбординг пользователей, снижает количество брошенных регистраций и повышает конверсию.

В Laravel это удобно реализуется через OAuth2-провайдеры, такие как Яндекс и Google. На практике чаще всего используется пакет Socialite, который берет на себя большую часть сложной логики.

Подготовка проекта Laravel

Перед началом убедись, что Laravel установлен и база данных подключена. Затем установи официальный пакет для OAuth:

composer require laravel/socialite

После установки необходимо добавить настройки в файл конфигурации config/services.php.

Настройка Google OAuth

Для Google нужно создать проект в Google Cloud Console и получить client_id и client_secret.

Добавь в config/services.php:

'google' => [
    'client_id' => env('GOOGLE_CLIENT_ID'),
    'client_secret' => env('GOOGLE_CLIENT_SECRET'),
    'redirect' => env('GOOGLE_REDIRECT_URI'),
],

В .env:

GOOGLE_CLIENT_ID=xxx
GOOGLE_CLIENT_SECRET=xxx
GOOGLE_REDIRECT_URI=http://localhost:8000/auth/google/callback

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

Яндекс использует аналогичную схему через OAuth-приложение в https://oauth.yandex.ru/.

Добавь в config/services.php:

'yandex' => [
    'client_id' => env('YANDEX_CLIENT_ID'),
    'client_secret' => env('YANDEX_CLIENT_SECRET'),
    'redirect' => env('YANDEX_REDIRECT_URI'),
],

И в .env:

YANDEX_CLIENT_ID=xxx
YANDEX_CLIENT_SECRET=xxx
YANDEX_REDIRECT_URI=http://localhost:8000/auth/yandex/callback

Миграция пользователей

Чтобы хранить внешние идентификаторы, добавим поля в таблицу пользователей:

php artisan make:migration add_social_fields_to_users_table

Миграция:

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('google_id')->nullable()->unique();
            $table->string('yandex_id')->nullable()->unique();
        });
    }

    public function down(): void
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn(['google_id', 'yandex_id']);
        });
    }
};

Маршруты авторизации

Добавим routes:

use App\Http\Controllers\SocialAuthController;

Route::get('/auth/google', [SocialAuthController::class, 'redirectToGoogle']);
Route::get('/auth/google/callback', [SocialAuthController::class, 'handleGoogleCallback']);

Route::get('/auth/yandex', [SocialAuthController::class, 'redirectToYandex']);
Route::get('/auth/yandex/callback', [SocialAuthController::class, 'handleYandexCallback']);

Контроллер SocialAuthController

Создаем контроллер:

php artisan make:controller SocialAuthController

Авторизация через Google

use Laravel\Socialite\Facades\Socialite;
use App\Models\User;
use Illuminate\Support\Facades\Auth;

class SocialAuthController extends Controller
{
    public function redirectToGoogle()
    {
        return Socialite::driver('google')->redirect();
    }

    public function handleGoogleCallback()
    {
        $googleUser = Socialite::driver('google')->stateless()->user();

        $user = User::updateOrCreate(
            ['google_id' => $googleUser->id],
            [
                'name' => $googleUser->name,
                'email' => $googleUser->email,
            ]
        );

        Auth::login($user);

        return redirect('/dashboard');
    }
}

Авторизация через Яндекс

Яндекс не всегда идет “из коробки” в Socialite, но чаще всего используется кастомный драйвер или стандартный OAuth через redirect.

Если Socialite-драйвер подключен:

public function redirectToYandex()
{
    return Socialite::driver('yandex')->redirect();
}

public function handleYandexCallback()
{
    $yandexUser = Socialite::driver('yandex')->stateless()->user();

    $user = User::updateOrCreate(
        ['yandex_id' => $yandexUser->id],
        [
            'name' => $yandexUser->name ?? $yandexUser->nickname,
            'email' => $yandexUser->email ?? null,
        ]
    );

    Auth::login($user);

    return redirect('/dashboard');
}

Кнопки входа на фронтенде

Простой пример Blade:

<a href="/auth/google">
    Войти через Google
</a>

<a href="/auth/yandex">
    Войти через Яндекс
</a>

Как это работает внутри

При нажатии кнопки пользователь перенаправляется на страницу авторизации Google или Яндекса. После подтверждения сервис возвращает временный code, который Laravel обменивает на access token.

Далее Socialite получает данные пользователя и создает или обновляет запись в базе.

Laravel автоматически выполняет вход через Auth::login().

Возможное улучшение: JWT вместо сессий

Если проект является API (SPA или мобильное приложение), вместо Auth::login() можно вернуть JWT:

$token = auth()->login($user);

return response()->json([
    'token' => $token
]);

Это позволяет отделить backend от frontend и работать через Bearer token.

Частые проблемы

Иногда возникают ошибки с redirect URI. Они почти всегда связаны с тем, что:

  • URL в .env не совпадает с настройками Google/Yandex

  • используется http вместо https

  • отличается порт или домен

Также важно использовать stateless() в API-проектах, чтобы избежать проблем с сессиями.

Итог

Авторизация через Яндекс и Google в Laravel строится вокруг OAuth2 и пакета Socialite. Вся сложность сводится к получению данных пользователя и привязке их к локальной учетной записи.

После этого можно расширять систему: добавлять JWT, роли, ограничения устройств или объединение нескольких социальных аккаунтов в один профиль.

Комментарии

Пока нет комментариев. Будьте первым, кто напишет.

Чтобы оставить комментарий, войдите в аккаунт.

Похожие статьи