Вы когда-нибудь задумывались, почему пользователи так любят кнопки «Войти через VK» или «Войти через Google»? Потому что это удобно. Не нужно запоминать ещё один пароль. А для разработчика это способ быстро расширить аудиторию. В этой статье я покажу, как добавить аутентификацию через социальные сети в Yii2. Мы разберём всё на конкретных примерах. Вы научитесь подключать OAuth, обрабатывать ответы и хранить данные пользователей.

Что такое OAuth и почему это важно

OAuth — это протокол, который позволяет пользователю дать доступ к своим данным на стороннем сервисе (например, VK), не передавая логин и пароль. Вместо этого вы получаете токен. Этот токен — как ключ от шкафчика. Вы можете открыть его, чтобы взять имя и email, но не можете изменить пароль. Yii2 поддерживает OAuth через расширение yiisoft/yii2-authclient. Оно уже включает готовые клиенты для популярных сетей.

Установка и настройка расширения

Сначала установите пакет через Composer. Откройте терминал в корне проекта и выполните:

composer require yiisoft/yii2-authclient

После установки настройте компонент в конфигурационном файле (обычно config/web.php). Добавьте секцию authClientCollection:

'components' => [
    'authClientCollection' => [
        'class' => 'yii\authclient\Collection',
        'clients' => [
            'vkontakte' => [
                'class' => 'yii\authclient\clients\VKontakte',
                'clientId' => 'your_vk_app_id',
                'clientSecret' => 'your_vk_app_secret',
            ],
            'google' => [
                'class' => 'yii\authclient\clients\Google',
                'clientId' => 'your_google_client_id',
                'clientSecret' => 'your_google_client_secret',
            ],
            'facebook' => [
                'class' => 'yii\authclient\clients\Facebook',
                'clientId' => 'your_facebook_app_id',
                'clientSecret' => 'your_facebook_app_secret',
            ],
        ],
    ],
],

Замените your_* на реальные данные из настроек приложений соцсетей. Для VK нужно создать приложение в разделе «Мои приложения», для Google — в Google Cloud Console, для Facebook — в Facebook Developers.

Лайфхак: Храните ключи в переменных окружения, а не в коде. Используйте файл .env и библиотеку vlucas/phpdotenv. Это безопаснее.

Создание действия для входа

Теперь создадим контроллер, который будет обрабатывать запросы от соцсетей. Добавьте в SiteController действие actionAuth:

public function actions()
{
    return [
        'auth' => [
            'class' => 'yii\authclient\AuthAction',
            'successCallback' => [$this, 'onAuthSuccess'],
        ],
    ];
}

public function onAuthSuccess($client)
{
    $attributes = $client->getUserAttributes();
    // Логика поиска или создания пользователя
}

Метод onAuthSuccess получает массив данных от соцсети. В нём обычно есть id, email, имя. Дальше нужно найти пользователя в базе по внешнему id или email. Если пользователь новый — создаём запись.

Работа с базой данных

Создадим таблицу для хранения привязок соцсетей. В миграции:

$this->createTable('auth', [
    'id' => $this->primaryKey(),
    'user_id' => $this->integer()->notNull(),
    'source' => $this->string()->notNull(),
    'source_id' => $this->string()->notNull(),
]);
$this->addForeignKey('fk-auth-user', 'auth', 'user_id', 'user', 'id', 'CASCADE', 'CASCADE');

В модели User добавьте связь:

public function getAuths()
{
    return $this->hasMany(Auth::className(), ['user_id' => 'id']);
}

Теперь в методе onAuthSuccess реализуем логику:

public function onAuthSuccess($client)
{
    $attributes = $client->getUserAttributes();
    $source = $client->getId(); // например, 'vkontakte'
    $sourceId = $attributes['id'];

    // Ищем привязку
    $auth = Auth::findOne(['source' => $source, 'source_id' => $sourceId]);
    if ($auth) {
        // Пользователь уже есть, логиним
        Yii::$app->user->login($auth->user);
    } else {
        // Новый пользователь
        $user = User::findOne(['email' => $attributes['email']]);
        if (!$user) {
            $user = new User();
            $user->email = $attributes['email'];
            $user->name = $attributes['name'] ?? $attributes['first_name'];
            $user->password_hash = Yii::$app->security->generateRandomString();
            $user->save();
        }
        // Создаём привязку
        $auth = new Auth();
        $auth->user_id = $user->id;
        $auth->source = $source;
        $auth->source_id = $sourceId;
        $auth->save();

        Yii::$app->user->login($user);
    }
}

Добавление кнопок на страницу входа

В представлении site/login выведите ссылки на аутентификацию:


 ['site/auth'],
    'popupMode' => true,
]) ?>

Этот виджет автоматически сгенерирует кнопки для всех настроенных клиентов. Выглядит как набор иконок. Если хотите кастомизировать — передайте параметр options.

Параметр Описание
baseAuthUrl URL действия, которое обрабатывает OAuth
popupMode Открывать окно входа как popup (true) или перенаправлять (false)
clients Массив конкретных клиентов, если нужно показать не все
Правило: Всегда проверяйте, что email от соцсети подтверждён. Иначе злоумышленник может зарегистрироваться с чужим email. Используйте атрибут 'verified' или 'email_verified'.

Дополнительные настройки безопасности

Не забывайте про CSRF-защиту. Yii2 по умолчанию включает её для форм. Но OAuth-запросы приходят с внешних сайтов, поэтому отключите CSRF для действия auth в контроллере:

public function beforeAction($action)
{
    if ($action->id === 'auth') {
        $this->enableCsrfValidation = false;
    }
    return parent::beforeAction($action);
}

Также настройте редирект после успешного входа. По умолчанию пользователь попадает на главную. Измените это в компоненте user:

'user' => [
    'loginUrl' => ['site/login'],
    'returnUrl' => ['site/profile'],
],

Что в итоге

Мы подключили аутентификацию через VK, Google и Facebook в Yii2. Теперь пользователи могут войти без пароля. Вы узнали, как настроить OAuth-клиенты, обработать ответ и сохранить данные. Главное — не забывайте про безопасность: проверяйте email, храните ключи в .env и отключайте CSRF для OAuth-действий. Если возникнут вопросы — пишите в комментариях. Удачи в кодинге!

Студия WNDER