Диагностика задачи: зачем нужна авторизация через Google в WooCommerce
Стандартная авторизация WooCommerce предусматривает регистрацию через email и пароль. Многие пользователи предпочитают вход через соцсети или Google для удобства и быстрого доступа. Использование сторонних плагинов увеличивает нагрузку на сайт и может вызывать конфликты. В этой статье покажу, как добавить авторизацию через Google в WooCommerce без плагинов, используя Google API и встроенные хуки WordPress.
Подготовка: регистрация приложения в Google Cloud Console
Для начала нужно получить OAuth 2.0 Client ID для вашего сайта:
- Перейдите в Google Cloud Console.
- Создайте новый проект или выберите существующий.
- Перейдите в раздел Credentials (Учётные данные) и нажмите Create Credentials - OAuth client ID.
- Выберите тип приложения Web application.
- В поле Authorized redirect URIs добавьте URL, который будет обрабатывать ответ от Google, например
https://вашсайт.ru/google-callback. - Сохраните и запишите
Client IDиClient Secret.
Разработка: добавляем кнопку входа и логику авторизации
1. Добавление кнопки входа через Google на страницу входа WooCommerce
В functions.php вашей темы или в собственном плагине добавьте код для вывода кнопки:
add_action('woocommerce_login_form', function() {
$client_id = 'ВАШ_GOOGLE_CLIENT_ID';
$redirect_uri = urlencode(site_url('/google-callback'));
$scope = urlencode('email profile');
$auth_url = "https://accounts.google.com/o/oauth2/v2/auth?client_id={$client_id}&redirect_uri={$redirect_uri}&response_type=code&scope={$scope}&access_type=online&prompt=select_account";
echo '<a href="' . esc_url($auth_url) . '" class="button google-login-button" style="background:#4285F4;color:#fff;padding:10px 20px;border-radius:3px;text-decoration:none;display:inline-block;margin-top:10px;">Войти через Google</a>';
});2. Создаем endpoint для обработки ответа Google
Добавьте в functions.php обработчик для пути /google-callback. Регистрация endpoint необходима:
add_action('init', function() {
add_rewrite_rule('^google-callback/?','index.php?google_callback=1','top');
});
add_filter('query_vars', function($vars) {
$vars[] = 'google_callback';
return $vars;
});
add_action('template_redirect', function() {
if(get_query_var('google_callback')) {
process_google_login();
exit;
}
});3. Функция process_google_login — обмен кода на токен и авторизация пользователя
function process_google_login() {
if(empty($_GET['code'])) {
wp_redirect(wp_login_url());
exit;
}
$code = sanitize_text_field($_GET['code']);
$client_id = 'ВАШ_GOOGLE_CLIENT_ID';
$client_secret = 'ВАШ_GOOGLE_CLIENT_SECRET';
$redirect_uri = site_url('/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('Ошибка при получении токена Google.');
}
$body = json_decode(wp_remote_retrieve_body($response), true);
if(empty($body['access_token'])) {
wp_die('Ошибка авторизации Google: нет access_token');
}
// Получаем данные пользователя
$user_info_response = wp_remote_get('https://www.googleapis.com/oauth2/v1/userinfo?access_token=' . $body['access_token']);
if(is_wp_error($user_info_response)) {
wp_die('Ошибка при получении данных пользователя Google.');
}
$user_info = json_decode(wp_remote_retrieve_body($user_info_response), true);
if(empty($user_info['email'])) {
wp_die('Не удалось получить email пользователя.');
}
// Ищем пользователя по email
$user = get_user_by('email', $user_info['email']);
if(!$user) {
// Создаем пользователя
$username = sanitize_user(current(explode('@', $user_info['email'])));
$random_password = wp_generate_password(12, false);
$user_id = wp_create_user($username, $random_password, $user_info['email']);
if(is_wp_error($user_id)) {
wp_die('Ошибка создания пользователя: ' . $user_id->get_error_message());
}
$user = get_user_by('ID', $user_id);
}
// Логиним пользователя
wp_set_current_user($user->ID);
wp_set_auth_cookie($user->ID);
// Редирект на страницу аккаунта
wp_redirect(wc_get_account_endpoint_url('dashboard'));
exit;
}Проверка результата: как убедиться, что авторизация работает
- Перейдите на страницу входа WooCommerce: должна отображаться кнопка "Войти через Google".
- Нажмите кнопку и выполните вход через Google аккаунт.
- Если пользователь с таким email есть — выполнится вход, иначе — создастся новый пользователь.
- После успешного входа вы попадете в личный кабинет WooCommerce.
- Проверьте в админке WordPress в разделе "Пользователи" наличие нового пользователя, если он создавался.
Частые ошибки и их исправление
- Ошибка 404 на /google-callback — нужно обновить правила перезаписи, перейдите в Настройки - Постоянные ссылки и нажмите "Сохранить изменения".
- Не приходит код в GET-параметрах — проверьте, что Redirect URI в Google Cloud Console точно совпадает с
site_url('/google-callback'). - Ошибка при создании пользователя — возможно, конфликт с существующим логином. Меняйте имя пользователя, например
$username = $username . rand(100,999);. - Не происходит вход — убедитесь, что функции
wp_set_current_userиwp_set_auth_cookieвызываются до выхода из скрипта.
Практические советы по безопасности и производительности
- Используйте HTTPS на сайте, иначе OAuth авторизация не будет работать.
- Не храните
Client Secretв публичных репозиториях и не выводите его в браузере. - Для повышения безопасности можно дополнительно проверять IP Google и использовать state-параметр в OAuth для защиты от CSRF (не показано в простом примере).
- Кэширование результата авторизации не нужно, так как данные динамические.
Сравнение вариантов реализации авторизации через Google
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Плагины (например, Nextend Social Login) | Простая настройка, поддержка соцсетей, обновления | Зависимость от стороннего кода, нагрузка, возможные конфликты | Использовать проверенные плагины, минимизировать количество |
| Свой код на основе Google API | Контроль над кодом, меньше зависимостей | Требует знаний OAuth, ручная поддержка | Поддерживать простой и безопасный код, использовать WP хуки |