Вы когда-нибудь задумывались, почему пользователи так любят кнопки «Войти через 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.
Создание действия для входа
Теперь создадим контроллер, который будет обрабатывать запросы от соцсетей. Добавьте в 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 выведите ссылки на аутентификацию:
= AuthChoice::widget([
'baseAuthUrl' => ['site/auth'],
'popupMode' => true,
]) ?>
Этот виджет автоматически сгенерирует кнопки для всех настроенных клиентов. Выглядит как набор иконок. Если хотите кастомизировать — передайте параметр options.
| Параметр | Описание |
|---|---|
| baseAuthUrl | URL действия, которое обрабатывает OAuth |
| popupMode | Открывать окно входа как popup (true) или перенаправлять (false) |
| clients | Массив конкретных клиентов, если нужно показать не все |
Дополнительные настройки безопасности
Не забывайте про 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-действий. Если возникнут вопросы — пишите в комментариях. Удачи в кодинге!

