При разработке сложных проектов на 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, который поддерживает современные стандарты безопасности и интеграции.