Вопрос или проблема
Изменение пароля пользователя REST API
Я пытаюсь позволить пользователю изменить свой пароль через API. Здесь, похоже, я могу отправить POST-запрос к конечной точке пользователей с его идентификатором пользователя в конце, отправляя новый пароль в теле запроса в формате JSON. Итак,
POST на: https://example.com/wp-json/wp/v2/users/123
А в теле:
{
"password": "mySecretPassword"
}
В данном случае пользователь аутентифицирован через JWT и должен отправить токен в заголовке запроса.
Когда я пробовал это в Postman, запрос зависал на довольно долгое время, но, в конце концов, кажется, проходит, и пароль обновляется.
Я хотел бы знать, делаю ли я это правильно, и если да, то почему это занимает так много времени?
Этот вопрос был задан 9 месяцев назад, и, возможно, он решен сейчас. Но я отправлю ответ, чтобы помочь другим людям, которые могут задать этот вопрос:
Вы должны установить плагин JWT. Затем вам нужно создать Bearer Token, отправив имя пользователя и пароль по этому адресу:
https://example.com/wp-json/jwt-auth/v1/token
В Postman вам нужно вставить ваш Bearer Token на вкладке Auth и изменить ваш пароль, отправив запрос по этому адресу:
http://example.com/wp-json/wp/v2/users/123?password=newpassword
(123 – это пример идентификатора пользователя.)
Я создаю API для восстановления пароля в WordPress в реальном времени, используя
ссылку на сайт: Linuxtips
function frgpassword(){
global $wpdb, $wp_hasher;
$methode = $_GET;
if(empty($methode['username'])){
$response = [ 'error' => true, 'code' => 400, "message" => "Введите имя пользователя или зарегистрированный email" ];
} else {
$custom_users_table = CUSTOM_USER_TABLE;
$sql = $wpdb->prepare( "SELECT * FROM `{$custom_users_table}` WHERE `user_login` = %s OR `user_email` = %s;", array( $methode['username'], $methode['username'] ) );
$userdata = $wpdb->get_results($sql);
if(empty($userdata)){
$response = [ 'error' => true, 'code' => 404, "message" => "Пользователь не найден {$methode['username']}" ];
} else {
$user = $userdata['0'];
$allow = apply_filters( 'allow_password_reset', (is_multisite() && is_user_spammy( $user )) ? false : true, $user->ID );
if ( ! $allow ) {
$response = [ 'error' => true, 'code' => 403, "message" => "Сброс пароля не разрешен для этого пользователя" ];
} else {
$key = wp_generate_password( 20, false );
do_action( 'retrieve_password_key', $user->user_login, $key );
if ( empty( $wp_hasher ) ) {
require_once ABSPATH . WPINC . '/class-phpass.php';
$wp_hasher = new PasswordHash( 8, true );
}
// обновление нового пароля в базе данных
$wpdb->query($wpdb->prepare("UPDATE {$custom_users_table} SET user_activation_key= %s WHERE ID = %s"), array((time() . ':' . $wp_hasher->HashPassword( $key )), $user->ID));
$link = home_url("wp-login.php?action=rp&key={$key}&login={$user->user_login}&wp_lang=en_US");
$message = "Кто-то запросил сброс пароля для следующей учетной записи: \n Имя сайта: ".get_bloginfo()." из мобильного приложения \n \n Имя пользователя: {$user->user_login} \n Если это была ошибка, проигнорируйте это письмо, и ничего не произойдет. \n Чтобы сбросить ваш пароль, перейдите по следующему адресу: \n {$link} \n Этот запрос на сброс пароля был инициирован с IP-адреса ".ns_wp_user_ip();
$headers = array('From: '.get_bloginfo()." Мобильное приложение ".' ');
wp_mail($user->user_email,"[".get_bloginfo()."] Сброс пароля",$message,$headers);
$response = [ 'error' => false, 'code' => 200, "message" => "Ссылка для сброса пароля была отправлена на ваш зарегистрированный email" ];
}
}
}
return new WP_REST_Response($response, $response['code']);
}
Создание REST маршрута
register_rest_route('neoistone/v2', '/frgpassword', array(
'methode' => "GET",
'callback' => "frgpassword",
"permission_callback" => "frgpassword"
));
Ответ или решение
Для изменения пароля пользователя через REST API в WordPress есть несколько этапов, которые нужно пройти, чтобы все работало корректно. Давайте подробно рассмотрим этот процесс.
Шаг 1: Установка и настройка плагина
- Убедитесь, что у вас установлен плагин JWT Authentication for WP REST API. Он необходим для аутентификации запросов с помощью токенов.
Шаг 2: Получение токена
Для изменения пароля пользователю требуется аутентификация. Для этого следует получить Bearer Token:
- Отправьте POST-запрос на адрес:
https://example.com/wp-json/jwt-auth/v1/token
- В теле запроса передайте имя пользователя и пароль в формате JSON:
{ "username": "ваше_имя_пользователя", "password": "ваш_пароль" }
- В ответ вы получите токен, который будет необходим для дальнейших запросов.
Шаг 3: Изменение пароля
Для изменения пароля выполните следующие шаги:
-
Отправьте POST-запрос на адрес:
https://example.com/wp-json/wp/v2/users/123
Где
123
— это ID пользователя, чей пароль вы хотите изменить. -
В заголовок запроса добавьте
Authorization: Bearer ваш_токен
, полученный на предыдущем шаге. - В теле запроса передайте новый пароль в следующем формате JSON:
{ "password": "новый_пароль" }
Пример запроса в Postman
- Method: POST
- URL:
https://example.com/wp-json/wp/v2/users/123
- Headers:
Authorization: Bearer ваш_токен Content-Type: application/json
- Body (JSON):
{ "password": "новый_пароль" }
Замечание о времени ожидания
Если ваш запрос долго обрабатывается, это может быть связано с несколькими факторами:
-
Настройки сервера: Проверьте ограничения по времени выполнения запросов на вашем сервере (например,
max_execution_time
в PHP). -
Загрузка сервера: Если сервер перегружен или дело касается базы данных с большим объемом данных, это может отразиться на производительности.
-
Проблемы с сетью: Иногда задержка может быть вызвана сетью или вашим интернет-соединением.
- Плагины и темы: Некоторые плагины или темы могут оказывать влияние на производительность вашего сайта. Отключите плагины, которые могут конфликтовать.
Заключение
Следуя приведённым выше шагам, вы сможете изменить пароль пользователя через REST API в WordPress. Если вы столкнулись с длительным временем ожидания, проанализируйте настройки сервера, загрузку и плагины, чтобы выявить причину проблемы.