- Опубликовано: 19 мар 2025
- 35
Laravel Socialite для аутентификации пользователей через ВКонтакте
Ниже приведена базовая пошаговая инструкция по использованию пакета socialiteproviders/vkontakte
вместе с Laravel Socialite для аутентификации пользователей через ВКонтакте:
1. Установка пакета
Установите сам провайдер ВКонтакте (если ещё не установлен):
composer require socialiteproviders/vkontakte
Убедитесь, что базовый laravel/socialite
уже установлен (обычно он идёт по умолчанию, но если вдруг нет, выполните):
composer require laravel/socialite
2. Регистрация приложения в ВКонтакте
-
Перейдите на https://vk.com/apps?act=manage (или https://vk.com/editapp?act=create, если у вас нет ни одного приложения).
-
Нажмите «Создать приложение» или «Добавить приложение».
-
Заполните обязательные поля (например, название, описание) и т.д.
-
В разделе «Настройки» вашего приложения ВКонтакте получите:
- ID приложения (Client ID)
- Защищённый ключ (Client Secret)
-
В настройках авторизации задайте «Своё redirect URI», который будете использовать в Laravel (например,
https://your-domain.com/auth/vkontakte/callback
).
3. Настройки в Laravel (файл config/services.php
)
Добавьте следующий массив в config/services.php
:
'vkontakte' => [
'client_id' => env('VKONTAKTE_CLIENT_ID'),
'client_secret' => env('VKONTAKTE_CLIENT_SECRET'),
'redirect' => env('VKONTAKTE_REDIRECT_URI'),
],
И в файле .env
пропишите соответствующие переменные окружения:
VKONTAKTE_CLIENT_ID=Ваш_ID_приложения_ВК
VKONTAKTE_CLIENT_SECRET=Ваш_ключ_приложения_ВК
VKONTAKTE_REDIRECT_URI=https://your-domain.com/auth/vkontakte/callback
Важно: Убедитесь, что адрес, который вы здесь указали, совпадает с тем, который прописан в настройках приложения ВКонтакте.
4. Регистрация провайдера (Event Listener)
Для Laravel 11+
В Laravel 11 нет готового EventServiceProvider по умолчанию, поэтому добавьте привязку к событию в метод boot
своего AppServiceProvider или другого подходящего провайдера.
Откройте app/Providers/AppServiceProvider.php
и в метод boot()
добавьте:
use Illuminate\Support\Facades\Event;
use SocialiteProviders\Manager\SocialiteWasCalled;
use SocialiteProviders\VKontakte\Provider;
public function boot()
{
Event::listen(function (SocialiteWasCalled $event) {
$event->extendSocialite('vkontakte', Provider::class);
});
}
Для Laravel 10 и ниже
В app/Providers/EventServiceProvider.php
(или другом провайдере ивентов) добавьте:
protected $listen = [
\SocialiteProviders\Manager\SocialiteWasCalled::class => [
'SocialiteProviders\\VKontakte\\VKontakteExtendSocialite@handle',
],
];
Или, используя ту же концепцию, что и для Laravel 11 (через метод boot
и Event::listen
).
5. Использование в контроллерах или маршрутах
После того как всё настроено, используйте драйвер vkontakte
так же, как и любой другой драйвер Socialite.
Пример маршрутов (routes/web.php)
use Illuminate\Support\Facades\Route;
use Laravel\Socialite\Facades\Socialite;
Route::get('/auth/vkontakte', function () {
// Редирект на страницу авторизации ВКонтакте
return Socialite::driver('vkontakte')->redirect();
})->name('vkontakte.login');
Route::get('/auth/vkontakte/callback', function () {
// Получаем информацию о пользователе, после того, как он разрешил доступ
$user = Socialite::driver('vkontakte')->user();
// Доступные поля (пример):
// $user->getId();
// $user->getNickname();
// $user->getName();
// $user->getEmail();
// $user->getAvatar();
// Логика по добавлению пользователя в БД или авторизации в системе
// Например:
// $existingUser = User::where('email', $user->getEmail())->first();
// if ($existingUser) {
// Auth::login($existingUser);
// } else {
// $newUser = User::create([
// 'name' => $user->getName(),
// 'email' => $user->getEmail(),
// // ...
// ]);
// Auth::login($newUser);
// }
// Затем перенаправляете куда нужно
return redirect('/home');
});
Здесь важные моменты:
-
Маршрут
auth/vkontakte
– перенаправление пользователя для авторизации через ВКонтакте. -
Маршрут
auth/vkontakte/callback
– указанный вredirect
(и в настройках .env и VK) маршрут, на который будет приходить ответ после авторизации.
6. Получение дополнительных полей (опционально)
Если хотите получать больше данных о пользователе, можно указывать scope (permissions) при редиректе. Например, если вам нужны email или друзья пользователя:
return Socialite::driver('vkontakte')
->scopes(['email', 'friends'])
->redirect();
Также можно указать параметры запроса, например язык (locale) и т. д.:
return Socialite::driver('vkontakte')
->setScopes(['email', 'friends'])
->with(['lang' => 'ru'])
->redirect();
Для просмотра дополнительных параметров см. документацию https://vk.com/dev/api_requests.
7. Пример сохранения данных пользователя в БД
Пример логики в обработчике callback
, если вы хотите регистрировать/логинить пользователя в Laravel:
Route::get('/auth/vkontakte/callback', function () {
$vkUser = Socialite::driver('vkontakte')->user();
// Проверяем, есть ли пользователь с таким же email в базе
$existingUser = User::where('email', $vkUser->getEmail())->first();
if ($existingUser) {
// Логиним его
Auth::login($existingUser);
} else {
// Создаём нового пользователя
$newUser = User::create([
'name' => $vkUser->getName(),
'email' => $vkUser->getEmail(),
// Можно хранить и VK ID
'vk_id' => $vkUser->getId(),
// password нам не нужен, если мы не собираемся авторизовать по паролю
// но Laravel требует поле, можно поставить случайный или nullable
'password' => Hash::make(Str::random(24)),
]);
Auth::login($newUser);
}
return redirect('/home');
});
Подытожим
-
Установить пакеты
socialiteproviders/vkontakte
иlaravel/socialite
. -
Зарегистрировать приложение в ВКонтакте, получить
client_id
,client_secret
, прописать их в.env
. -
Настроить
services.php
:'vkontakte' => [ 'client_id' => env('VKONTAKTE_CLIENT_ID'), 'client_secret' => env('VKONTAKTE_CLIENT_SECRET'), 'redirect' => env('VKONTAKTE_REDIRECT_URI'), ],
- Добавить Event Listener для расширения Socialite провайдером VKontakte.
-
Настроить маршруты
redirect
иcallback
. -
В контроллере/замыкании вызывать
Socialite::driver('vkontakte')->redirect()
и обрабатывать ответSocialite::driver('vkontakte')->user()
в колбэке. - Сохранять и авторизовывать пользователя в Laravel по полученным данным.
На этом всё — после этих шагов у вас будет работать авторизация через ВКонтакте.
Была статья полезной: