Как избежать проблем с кроссдоменной авторизацией в WordPress

При разработке сложных проектов на WordPress часто возникает необходимость реализовать систему авторизации, которая работает корректно между разными доменами. Например, если у вас есть несколько сайтов на WordPress, работающих в связке, и вы хотите, чтобы пользователь, авторизовавшийся на одном из них, автоматически считался авторизованным и на другом. Такая задача часто вызывает проблемы с кроссдоменной авторизацией.

Что такое кроссдоменная авторизация и почему возникают проблемы

Кроссдоменная авторизация — это процесс, когда данные об авторизации пользователя (сессия, куки) передаются и распознаются между сайтами с разными доменами. Основная сложность в том, что браузеры по умолчанию не позволяют делиться куками между разными доменами из соображений безопасности. Куки, выставленные для домена example1.com, не будут автоматически доступны для example2.com.

Кроме того, современные браузеры ужесточают правила безопасности: куки должны иметь правильные настройки атрибутов SameSite, Secure и использовать HTTPS. Без правильной настройки таких атрибутов и механизмов обмена данными кроссдоменная авторизация просто не будет работать.

Типичные сценарии использования

  • Сеть сайтов на WordPress с разными доменами и единым логином.
  • Интеграция с внешними сервисами или лендингами, где нужна авторизация из основного сайта.
  • Порталы с субдоменами и основным доменом, где нужна общая сессия.

Основные подходы к решению проблемы кроссдоменной авторизации

Рассмотрим популярные решения и их плюсы и минусы.

1. Использование единого домена или wildcard-куков для субдоменов

Если у вас сайты находятся на поддоменах основного домена, например, site1.example.com и site2.example.com, можно использовать куки с доменом .example.com. Тогда куки будут доступны всем поддоменам. Для установки таких куков в WordPress можно использовать фильтр wpexpert_set_auth_cookie_domain:

function wpexpert_set_auth_cookie_domain( $domain ) {
    return '.example.com';
}
add_filter( 'auth_cookie_domain', 'wpexpert_set_auth_cookie_domain' );

Этот способ прост, но работает только в рамках одного домена и его поддоменов, не поможет для разных доменов.

2. Использование внешнего центра аутентификации через OAuth или JWT

Для сайтов на разных доменах лучше использовать протоколы единого входа (SSO) — OAuth2 или JWT. В этом случае один из сайтов выступает в роли Identity Provider (IdP), а другие — Relying Parties (RP). Пользователь при входе получает токен, который передается и проверяется на других сайтах.

Для WordPress есть несколько плагинов, которые реализуют такую схему:

  • WPGPT — поддерживает авторизацию через JWT и OAuth.
  • Clearfy Pro — имеет расширенные настройки безопасности и интеграции.

Пример реализации авторизации через JWT

Ниже пример простого решения для передачи JWT токена между доменами:

function wpexpert_generate_jwt_for_user( $user_id ) {
    $user = get_userdata( $user_id );
    $secret_key = 'your_secret_key';
    $payload = [
        'user_id' => $user->ID,
        'email' => $user->user_email,
        'iat' => time(),
        'exp' => time() + 3600,
    ];
    $jwt = JWT::encode( $payload, $secret_key, 'HS256' );
    return $jwt;
}

function wpexpert_authenticate_with_jwt() {
    if ( isset( $_GET['token'] ) ) {
        $token = sanitize_text_field( $_GET['token'] );
        $secret_key = 'your_secret_key';
        try {
            $payload = JWT::decode( $token, $secret_key, ['HS256'] );
            $user = get_user_by( 'ID', $payload->user_id );
            if ( $user ) {
                wp_set_current_user( $user->ID );
                wp_set_auth_cookie( $user->ID );
            }
        } catch ( Exception $e ) {
            // Ошибка декодирования токена
        }
    }
}
add_action( 'init', 'wpexpert_authenticate_with_jwt' );

Для работы с JWT можно использовать библиотеку firebase/php-jwt, которую подключают через Composer.

3. Настройка CORS и куков с атрибутом SameSite=None; Secure

Для того чтобы куки передавались между разными доменами, нужно обязательно:

  • Использовать HTTPS.
  • Установить куки с атрибутами SameSite=None и Secure.
  • Настроить сервер так, чтобы он разрешал CORS (Cross-Origin Resource Sharing) для нужных доменов.

В WordPress для выставления куков с нужными атрибутами можно использовать фильтр wpexpert_set_auth_cookie_params:

function wpexpert_set_auth_cookie_params( $params ) {
    $params['samesite'] = 'None';
    $params['secure'] = true;
    return $params;
}
add_filter( 'auth_cookie_params', 'wpexpert_set_auth_cookie_params' );

Также на сервере Apache или Nginx нужно добавить заголовки CORS, разрешающие запросы с нужных доменов:

# Пример для Apache
Header set Access-Control-Allow-Origin "https://example2.com"
Header set Access-Control-Allow-Credentials true

Практические советы по отладке и безопасности

При реализации кроссдоменной авторизации обращайте внимание на следующие моменты:

  • Тщательно тестируйте на разных браузерах, так как политика безопасности и поддержка куков с SameSite=None отличатся.
  • Используйте HTTPS на всех сайтах, иначе куки с атрибутом Secure не будут работать.
  • Ограничивайте время жизни токенов и куков, чтобы снизить риск компрометации.
  • Регулярно проверяйте логи и мониторьте попытки несанкционированного доступа.

Инструменты и плагины для отладки

Для отладки кроссдоменных запросов полезно использовать:

  • Расширения браузера для просмотра и управления куками (например, EditThisCookie).
  • Инструменты разработчика в браузере для проверки заголовков CORS.
  • Плагины WordPress, позволяющие управлять куками и авторизацией, например, Clearfy Pro.

Заключение

Кроссдоменная авторизация в WordPress — задача технически сложная, но решаемая с помощью правильных инструментов и подходов. Для сайтов на поддоменах удобно использовать wildcard-куки, для разных доменов — протоколы SSO на базе JWT или OAuth. Важна правильная настройка атрибутов куков и CORS. Использование готовых плагинов и библиотек значительно упрощает процесс.

Если хотите быстро внедрить авторизацию через JWT, обратите внимание на плагин WPGPT, который поддерживает современные стандарты безопасности и интеграции.

Как удалить определённые метаданные из базы данных WordPress без плагинов
20.04.2026
WooCommerce: как избежать ошибок при автоматическом удалении незавершённых заказов
19.05.2026
Как создать настройку отображения для каждого пользователя в WordPress
15.02.2026
Как использовать WPRemark для оценки пользователей в WordPress
27.03.2026
Как сделать автоматическое сохранение записи в WordPress через плагин
01.02.2026