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, роли, ограничения устройств или объединение нескольких социальных аккаунтов в один профиль.
Комментарии
Чтобы оставить комментарий, войдите в аккаунт.