Вопрос или проблема
Есть 2 сайта: example.com и sub.example.com. Оба сайта работают на WordPress.
На сайте sub.example.com есть личный кабинет для пользователей; на сайте example.com аккаунт отсутствует.
Данные между сайтами синхронизируются при любых операциях с учетными данными, включая вход в аккаунт.
Есть задача выяснить на сайте example.com, что пользователь в данный момент авторизован на сайте sub.example.com. Я отправляю запрос через собственный маршрут REST API, но WordPress возвращает 0 в ответ на wp_get_current_user(). Как я понимаю, нужно авторизовать запрос. Для авторизации я на данный момент вижу такое решение:
- Сделать куки доступными для example.com:
define('COOKIE_DOMAIN', '.example.com');
define('COOKIEPATH', "https://wordpress.stackexchange.com/");
- На сайте sub.example.com разместить код (не лучший способ) для выдачи nonce-кода:
add_action('init', function() {
if (isset($_GET['secret_token']) && $_GET['secret_token'] === 'sdfus8689yhj3hlwiuhey98wyewhuiehiw8932y') {
echo wp_create_nonce( 'wp_rest' );
exit;
}
}
- На example.com запросить nonce-код следующим образом:
$cookies = $_COOKIE;
$response = wp_remote_get('https://sub.example.com/?secret_token=ksdfus8689yhj3hlwiuhey98wyewhuiehiw8932y', array(
'cookies' => $cookies,
));
И с полученным nonce-кодом мы уже успешно выполняем запрос.
Я понимаю, что эта схема не очень красивая, но насколько безопасна эта схема? Или есть лучшее решение?
Сразу уточню, что даже при включенной синхронизации при входе в аккаунт на sub.example.com пользователь остается неавторизованным на сайте example.com.
Этот случай используется, но не работает, пользователь не авторизуется на example.com
Как поделиться куками и сессиями между доменом и поддоменом?
Ответ или решение
Вопрос, касающийся взаимодействия между доменом и поддоменом через REST API в контексте WordPress, поднимает несколько важных технических аспектов, связанных с авторизацией и безопасностью передачи данных. Давайте рассмотрим этот случай более подробно и предложим возможные решения для улучшения эффективности и безопасности.
Теория
Когда мы имеем дело с несколькими сайтами под одним доменом и поддоменом, такими как example.com и sub.example.com, одной из основных задач является обеспечение бесперебойной синхронизации данных и авторизации пользователей между этими сайтами. В WordPress обработка авторизации и аутентификации преимущественно полагается на механизмы куки и сессий, что может оказаться проблематичным при работе с несколькими доменами и поддоменами.
Основной проблемой, представленной в вопросе, является необходимость проверить, авторизован ли пользователь на поддомене sub.example.com из основного домена example.com. Существующая реализация предполагает использование нестандартного REST API маршрута для передачи информации об авторизации, однако, функция wp_get_current_user()
возвращает 0, указывая на то, что текущий запрос не авторизован.
Пример
-
Общий доступ к кукис: Идея изменить
COOKIE_DOMAIN
на.example.com
потенциально позволяет куки быть доступными для обоих доменов. Однако изменение пути кукис (COOKIEPATH) на URL начальной страницы, как это указано в примере, не имеет смысла, так как куки должны управляться исключительно на уровне домена и пути, а не конкретных URL технологий. -
Временный токен безопасности (nonce): Создание nonce на поддомене и передача его на основной домен — это временное решение для преодоления ограничения с авторизацией запроса. Однако это создает потенциальный вектор для атак, так как передача токенов через GET параметры делает их уязвимыми для перехвата.
-
Обращение с кукми: Использование текущих куки в запросе REST API с помощью
wp_remote_get
может быть неэффективным, если первичная авторизация не управляется должным образом. В итогеwp_get_current_user()
на основном домене example.com не может определить текущего пользователя, основываясь только на предоставленных куки.
Применение
Чтобы обеспечить надежность и безопасность в данном случае, рекомендую рассмотреть следующие улучшения:
-
OAuth или JWT токены: Вместо зависимости от куки и nonce, используйте современную систему аутентификации, такую как OAuth или JWT. Эти стандарты предназначены для безопасной передачи информации об авторизации между серверами и обеспечивают больше безопасности по сравнению с передачей куки и временных токенов.
-
Cookie SameSite атрибут: Если зависимость от куки остается, установите атрибут SameSite на ‘None’ и обеспечьте передачу только через HTTPS, чтобы куки могли быть доступны на разных субдоменах. Это повысит безопасность, предотвращая атаки разного рода.
-
API Gateway: Внедрите API-шлюз, который объединяет все вызовы API между доменом и поддоменом. Это решение позволит централизованно управлять доступом и авторизацией, обеспечивая единую точку проверки полномочий пользователей.
-
Секуризация передачи данных: Все REST API запросы должны выполняться через HTTPS для предотвращения перехвата данных. Наряду с этим, предусмотрите возможности для дополнительной валидации имеющихся данных аутентификации.
Предложенные решения обеспечивают лучшую практику с точки зрения безопасности и эффективности при обмене данными об авторизации между доменом и поддоменом. Поскольку безопасность должна оставаться в приоритете при обработке личных данных, следование современным стандартам аутентификации имеет решающее значение.
Таким образом, переход от простых механизмов передачи данных об авторизации к более защищенным технологиям, таким как OAuth или JWT, является наиболее перспективным путем. Надеюсь, это разъяснение поможет улучшить вашу реализацию системы авторизации между доменом и поддоменом в WordPress.