Проблема: необходимость авторизации через социальные сети без сторонних плагинов
Многие владельцы WooCommerce-магазинов хотят упростить процесс входа для пользователей, добавив авторизацию через популярные социальные сети (ВКонтакте, Google, Facebook и др.). Однако использование плагинов часто приводит к конфликтам, замедляет сайт и создает проблемы с безопасностью. В этой статье рассмотрим, как реализовать авторизацию через соцсети вручную, без плагинов, используя API OAuth и собственный код.
Диагностика задачи и подготовка
Для реализации необходимы следующие компоненты:
- Регистрация приложения в соцсетях для получения client_id и client_secret;
- Настройка возвратного URL (redirect_uri) для обработки ответа авторизации;
- Обработка OAuth2 потока: получение кода, обмен на токен, запрос профиля пользователя;
- Создание/поиск пользователя в базе WooCommerce / WordPress и вход под ним.
Проверяйте, что ваш сайт работает по HTTPS — OAuth требует защищенного соединения для redirect_uri.
Пошаговое решение: пример с Google OAuth2
1. Регистрация приложения в Google Cloud Console
Создайте проект, включите API Google+ или People API, получите client_id и client_secret, настройте redirect_uri, например: https://site.ru/auth/google-callback/
2. Добавление кнопки входа
Выведите на страницу WooCommerce входа кнопку с ссылкой на авторизацию Google:
<a href="https://accounts.google.com/o/oauth2/v2/auth?client_id=ВАШ_CLIENT_ID&redirect_uri=https%3A%2F%2Fsite.ru%2Fauth%2Fgoogle-callback%2F&response_type=code&scope=openid%20email%20profile&access_type=offline">Войти через Google</a>3. Обработка callback (пример в functions.php или отдельном плагине)
Создайте endpoint, который принимает code и обменивает его на токен, а затем получает профиль пользователя. Ниже упрощенный пример:
function handle_google_auth_callback() {
if (!isset($_GET['code'])) {
return;
}
$code = sanitize_text_field($_GET['code']);
$client_id = 'ВАШ_CLIENT_ID';
$client_secret = 'ВАШ_CLIENT_SECRET';
$redirect_uri = 'https://site.ru/auth/google-callback/';
$response = wp_remote_post('https://oauth2.googleapis.com/token', [
'body' => [
'code' => $code,
'client_id' => $client_id,
'client_secret' => $client_secret,
'redirect_uri' => $redirect_uri,
'grant_type' => 'authorization_code'
]
]);
if (is_wp_error($response)) {
wp_die('Ошибка при получении токена');
}
$body = json_decode(wp_remote_retrieve_body($response), true);
if (empty($body['access_token'])) {
wp_die('Токен не получен');
}
// Запрос информации о пользователе
$user_info_response = wp_remote_get('https://www.googleapis.com/oauth2/v3/userinfo', [
'headers' => [
'Authorization' => 'Bearer ' . $body['access_token']
]
]);
if (is_wp_error($user_info_response)) {
wp_die('Ошибка при получении данных пользователя');
}
$user_info = json_decode(wp_remote_retrieve_body($user_info_response), true);
if (empty($user_info['email'])) {
wp_die('Email пользователя не найден');
}
// Поиск или создание пользователя
$user = get_user_by('email', $user_info['email']);
if (!$user) {
$user_id = wp_create_user($user_info['email'], wp_generate_password(), $user_info['email']);
if (is_wp_error($user_id)) {
wp_die('Не удалось создать пользователя');
}
$user = get_user_by('ID', $user_id);
wp_update_user([
'ID' => $user_id,
'display_name' => $user_info['name'],
]);
}
// Авторизация пользователя
wp_set_current_user($user->ID);
wp_set_auth_cookie($user->ID);
wp_redirect(home_url());
exit;
}
add_action('init', 'handle_google_auth_callback');4. Создание страницы/роута для callback
Для корректной работы redirect_uri нужно зарегистрировать endpoint в WordPress. Можно использовать rewrite rules:
function add_google_auth_rewrite_rule() {
add_rewrite_rule('^auth/google-callback/?$', 'index.php?google_auth=1', 'top');
}
add_action('init', 'add_google_auth_rewrite_rule');
function add_google_auth_query_var($vars) {
$vars[] = 'google_auth';
return $vars;
}
add_filter('query_vars', 'add_google_auth_query_var');
function google_auth_template_redirect() {
if (get_query_var('google_auth')) {
handle_google_auth_callback();
exit;
}
}
add_action('template_redirect', 'google_auth_template_redirect');Проверка результата после внедрения
- Нажмите кнопку «Войти через Google» на странице авторизации WooCommerce.
- Убедитесь, что происходит редирект на Google и после ввода данных возвращает на сайт.
- Проверьте, что пользователь создаётся или находится по email и автоматически входит в систему.
- В админке WordPress проверьте список пользователей: новый пользователь должен появиться с корректным email и именем.
Частые ошибки и способы их исправления
- Ошибка «redirect_uri mismatch» — неверно указан redirect_uri при регистрации приложения или в коде. Проверьте точное совпадение URL и его протокола (http/https).
- Отсутствие email в профиле — для Google нужно указывать scope с email и profile. Убедитесь, что scope выглядит так:
openid email profile. - Пользователь не создаётся — проверьте права на создание пользователей, нет ли ограничений в хостинге или плагинах безопасности.
- Проблемы с куками и сессией — убедитесь, что вызовы
wp_set_auth_cookieиwp_set_current_userидут до отправки заголовков, и что в шаблонах нет лишних echo перед этим.
Практические советы для безопасности и производительности
- Храните
client_secretв файлеwp-config.phpили в переменных окружения, а не в открытом коде. - Используйте nonce и проверку реферера при обработке callback, чтобы защититься от CSRF-атак.
- Ограничьте scope только необходимыми правами, не запрашивайте больше, чем нужно.
- Кешируйте токены в базе или transient для уменьшения числа запросов, если планируете использовать их для дальнейших API вызовов.
- Проверяйте обновления API соцсетей, так как протоколы OAuth и эндпоинты могут меняться.
Сравнение способов реализации авторизации через соцсети
| Метод | Плюсы | Минусы |
|---|---|---|
| Готовый плагин (например, Nextend Social Login) | Быстрая настройка, минимум кода | Зависимость от стороннего кода, возможные конфликты, нагрузка |
| Ручная реализация через OAuth | Контроль, безопасность, оптимизация под проект | Сложность настройки, требуется поддержка и обновления |
| Внешние сервисы (Auth0, Firebase) | Масштабируемость, готовые решения | Платность, зависимость от сторонних сервисов |