Авторизация через Yandex, ВК, Telegram с помощью Laravel Socialite

Вступление

В интернете есть множество статей и руководств по интеграции OAuth авторизации через популярных провайдеров, таких как Google, Facebook и Twitter, в проекты на Laravel. Но как это сделать через Yandex, ВК и т.п. информации в рунете вообще нет.

Буду показывать на примере Яндекса. Через другие провайдеры делайте аналогично.

Шаг 1. Создание приложения

Для начала регистрируем наше приложение в Yandex OAuth

Вводим название и т.к. используем Laravel - выбираем Веб-сервисы

Вводим название и т.к. используем Laravel — выбираем Веб-сервисы

Вставляем ссылку на страницу, куда будет перенаправлен пользователь после авторизации (например на главную)

Вставляем ссылку на страницу, куда будет перенаправлен пользователь после авторизации (например на главную)

После регистрации приложения переходим на страницу нашего приложения и сохраняем эти 3 поля, они нам понадобятся чуть позже.

426c70b33c8585085d495faefd51ec68.png

Шаг 2. Установка Socialite

Устанавливаем Laravel Socialite в наш проект через composer

composer require laravel/socialite

Устанавливаем SocialiteProviders

SocialiteProviders — это расширение для Laravel Socialite, которое добавляет поддержку многих дополнительных OAuth-провайдеров, включая Yandex, ВК, Telegram и другие. Полный список провайдеров на их сайте.

composer require socialiteproviders/yandex

Шаг 3. Настройка проекта

В файле config/services.php добавим настройки для Yandex:

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

Вставляем в .env файл переменные которые нам дал Яндекс:

YANDEX_CLIENT_ID=*ClientID*
YANDEX_CLIENT_SECRET=*Client secret*
YANDEX_REDIRECT_URI=*Redirect URI для веб-сервисов*

Добавим маршруты для перенаправления на Yandex и обработки обратного вызова:

Route::get('login/yandex', [AuthenticatedSessionController::class, 'yandex'])->name('yandex');
Route::get('login/yandex/redirect', [AuthenticatedSessionController::class, 'yandexRedirect'])->name('yandexRedirect');

Добавим необходимые функции в контроллер:

    use Laravel\Socialite\Facades\Socialite;
    use Str;   

   public function yandex() // перенаправляем юзера на яндекс Auth
    {
        return Socialite::driver('yandex')->redirect();
    }

    public function yandexRedirect() // принимаем возвращаемые данные и работаем с ними
    {
        $user = Socialite::driver('yandex')->user();

        $user = User::firstOrCreate([ // используем firstOrCreate для проверки есть ли такие пользователи в нашей БД
            'email' => $user->email
        ], [
            'name' => $user->user['display_name'], // display_name - переменаая хранящая полное ФИО пользователя
                                                  // остальные переменные можете посмотреть использовав $dd('$user')
            'password' => Hash::make(Str::random(24)),
        ]);

        Auth::login($user, true);

        redirect()->route('main');
    }

Ставив на кнопку «войти через яндекс» наш первый маршрут и готово. По такой же схеме делаете telegram, vk и другие сервисы указанные в socialiteproviders.

© Habrahabr.ru