Синхронизация учетных записей пользователей между основными и подчиненными сайтами WordPress

Вопрос или проблема

У меня есть два сайта на WordPress: xxx.com и deneme.xxx.com. Я хочу отправить данные пользователя (имя пользователя, пароль, электронная почта, имя, фамилия) пользователя, который регистрируется на xxx.com, на deneme.xxx.com через API. Я написал следующий код, который отправляет данные, но у меня возникла проблема с отправкой пароля. Когда пользователь пытается войти на подсайт, он получает ошибку неправильного пароля.

Код, добавленный на главный сайт (xxx.com):

add_action('user_register', 'send_user_data_to_subsite', 10, 1);

function send_user_data_to_subsite($user_id) {
    // Получаем данные нового пользователя
    $user = get_userdata($user_id);
    $username = $user->user_login;
    $first_name = $user->first_name;
    $last_name = $user->last_name;
    $email = $user->user_email;
    $password = $user->user_pass;  // Получаем настоящий пароль здесь

    // Отправляем данные на конечную точку API
    $response = wp_remote_post('http://www.deneme.xxx.com/wp-json/my_namespace/v1/sync_user/', [
        'method'    => 'POST',
        'body'      => json_encode([
            'username'  => $username,
            'first_name'=> $first_name,
            'last_name' => $last_name,
            'email'     => $email,
            'password'  => $password,  // Отправка пароля в открытом виде
        ]),
        'headers'   => [
            'Content-Type' => 'application/json',
        ],
    ]);

    $body = wp_remote_retrieve_body($response);
    // Обработка ответа
}

Код, добавленный на подсайт (deneme.xxx.com):

add_action('rest_api_init', function () {
    register_rest_route('my_namespace/v1', '/sync_user/', [
        'methods' => 'POST',
        'callback' => 'sync_user_from_another_site',
        'permission_callback' => '__return_true',
    ]);
});

function sync_user_from_another_site(WP_REST_Request $request) {
    $data = $request->get_json_params();

    // Получаем данные
    $username = sanitize_text_field($data['username']);
    $first_name = sanitize_text_field($data['first_name']);
    $last_name = sanitize_text_field($data['last_name']);
    $email = sanitize_email($data['email']);
    $password = sanitize_text_field($data['password']);  // Получаем пароль в открытом виде

    // Создаем нового пользователя (используем пароль в открытом виде)
    $user_id = wp_create_user($username, $password, $email);
    if (is_wp_error($user_id)) {
        return new WP_REST_Response(['success' => false, 'message' => 'Пользователь не может быть создан.'], 500);
    }

    // Обновляем информацию о пользователе
    wp_update_user([
        'ID' => $user_id,
        'first_name' => $first_name,
        'last_name' => $last_name,
    ]);

    return new WP_REST_Response(['success' => true, 'message' => 'Пользователь успешно синхронизирован.'], 200);
}

Цель этого кода: xxx.com – мой главный сайт. Каждый, кто становится членом здесь, должен автоматически стать членом моего подсайта trial.xxx.com. Я хочу позволить пользователю входить на подсайт с данными, которые он использовал на главном сайте.

Ответ или решение

Синхронизация пользовательских аккаунтов между основным и субсайтом на WordPress представляет собой важную задачу, особенно если ваша цель – предоставить пользователям удобный и бесшовный опыт при работе с несколькими сайтами. В вашем случае, вы хотите, чтобы пользователи, зарегистрировавшиеся на основном сайте (xxx.com), также автоматически создавались на субсайте (deneme.xxx.com). Давайте разберем вашу проблему, сосредоточившись на корректной передаче пароля и лучших практиках в процессе реализации.

Проблема передачи пароля

Ваша основная проблема заключается в том, что здоровье и безопасность паролей пользователей должны быть гарантированы. Ваша текущая реализация передает пароль в открытом виде (как текст), что является обычной практикой, однако с точки зрения безопасности это требует доработки.

Рекомендации для исправления проблемы

1. Хранение пароля в зашифрованном виде

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

2. Использование API для создания пользователя

Вместо того чтобы отправлять пароль в открытом виде, вы можете использовать WordPress функции, которые уже существуют, для обработки управления пользователями.

Ваша функция на главном сайте не должна передавать пароль, а вместо этого следует передать только необходимые данные для создания пользователя. На субсайте вы можете создать пользователя, используя функцию wp_create_user() и генерируя пароль самостоятельно, либо использовать другой подход.

Измененный код для передачи данных

Код на основном сайте (xxx.com):

add_action('user_register', 'send_user_data_to_subsite', 10, 1);

function send_user_data_to_subsite($user_id) {
    $user = get_userdata($user_id);
    $username = $user->user_login;
    $first_name = $user->first_name;
    $last_name = $user->last_name;
    $email = $user->user_email;

    // Отправляем данные без пароля
    $response = wp_remote_post('http://deneme.xxx.com/wp-json/my_namespace/v1/sync_user/', [
        'method'    => 'POST',
        'body'      => json_encode([
            'username'  => $username,
            'first_name' => $first_name,
            'last_name' => $last_name,
            'email'     => $email
        ]),
        'headers'   => [
            'Content-Type' => 'application/json',
        ],
    ]);

    // Опционально обработайте ответ
}

Код на субсайте (deneme.xxx.com):

add_action('rest_api_init', function () {
    register_rest_route('my_namespace/v1', '/sync_user/', [
        'methods' => 'POST',
        'callback' => 'sync_user_from_another_site',
        'permission_callback' => '__return_true',
    ]);
});

function sync_user_from_another_site(WP_REST_Request $request) {
    $data = $request->get_json_params();

    $username = sanitize_text_field($data['username']);
    $first_name = sanitize_text_field($data['first_name']);
    $last_name = sanitize_text_field($data['last_name']);
    $email = sanitize_email($data['email']);

    // Генерация пароля
    $password = wp_generate_password(); // Генерация случайного пароля

    // Создание нового пользователя
    $user_id = wp_create_user($username, $password, $email);

    if (is_wp_error($user_id)) {
        return new WP_REST_Response(['success' => false, 'message' => 'Пользователь не был создан.'], 500);
    }

    // Обновление информации пользователя
    wp_update_user([
        'ID' => $user_id,
        'first_name' => $first_name,
        'last_name' => $last_name,
    ]);

    // Здесь можно рассмотреть возможность отправки информации о пароле пользователю, чтобы он мог самостоятельно его изменить
    return new WP_REST_Response(['success' => true, 'message' => 'Пользователь успешно синхронизирован.', 'password' => $password], 200);
}

Заключение

Эти изменения помогут вам решить проблему отправки пароля и повысить безопасность пользовательских данных. Использование сгенерированного пароля позволяет избегать передачи открытых данных, что весьма важно с точки зрения безопасности. Рекомендуется подумать о том, как уведомить пользователей о новом пароле и предложить им возможность его изменить после первого входа на субсайт. Таким образом, вы обеспечите как безопасность, так и удобство для пользователей.

Оцените материал
Добавить комментарий

Капча загружается...