Как использовать WordPress REST API для входа пользователя?
Я хочу использовать REST API для получения имени пользователя и пароля из запроса, передать их в wp_authenticate(), а затем вернуть ответ о корректности учетных данных. Как это можно реализовать?

Добавьте код в functions.php И отправьте данные по маршруту
add_action( 'rest_api_init', 'register_api_hooks' );
// Пользовательские конечные точки API для WP-REST API
function register_api_hooks() {
register_rest_route(
'custom-plugin', '/login/',
array(
'methods' => 'POST',
'callback' => 'login',
)
);
}
function login() {
// Ваша логика здесь.
return wp_signon( array(
'user_login' => $_POST['user_login'],
'user_password' => $_POST['user_password'],
'remember' => $_POST['remember']
), false );
}

Существует 3 способа аутентификации пользователя с использованием REST API endpoint запроса:
1. Использование cookies - это способ, которым WordPress отслеживает аутентифицированных пользователей в POST-запросах. Вы передаете данные аутентификации в REST-запросе, используете функцию wp_signon()
функцию для входа пользователя, и при успешной аутентификации устанавливаете cookie с помощью функции wp_set_auth_cookie() функции:
$creds = array(
'user_login' => 'example', // Логин пользователя
'user_password' => 'plaintextpw', // Пароль в открытом виде
'remember' => true // Запомнить пользователя
);
$user = wp_signon( $creds, false );
if ( is_wp_error( $user ) ) {
$msg = $user->get_error_message(); // Получаем сообщение об ошибке
}else{
wp_clear_auth_cookie();
wp_set_current_user ( $user->ID ); // Устанавливаем текущего пользователя
wp_set_auth_cookie ( $user->ID ); // Устанавливаем данные аутентификации в cookie
$msg = "Вход выполнен успешно";
}
Обсуждение этого метода можно найти в этой ветке форума WordPress.
2. Использование Basic Authentication запросов к вашему серверу
Идея заключается в том, что для каждого REST-запроса вы передаете учетные данные пользователя (каждый раз) через SSL-соединение. Группа WordPress API предоставляет плагин в своем репозитории GitHub, который позволяет кодировать учетные данные пользователя и декодировать их на сервере для аутентификации. Например, для удаления поста пользователя на сервере:
let user='...', pw='...';
jQuery.ajax({
url: 'http://your-domain/wp-json/wp/v2/posts/50',
method: 'DELETE',
crossDomain: true,
beforeSend: function ( xhr ) {
xhr.setRequestHeader( 'Authorization', 'Basic ' + Base64.encode( user + ':' + pw ) );
},
success: function( data, txtStatus, xhr ) {
console.log( data );
console.log( xhr.status );
}
});
Подробнее см. в этом руководстве
3. Использование сторонней аутентификации, такой как открытый стандарт OAuth.
Этот метод использует Google и позволяет вашему сайту идентифицировать пользователей на основе их учетных данных Google. WordPress.com также использует этот метод для аутентификации в своем сервисе блогов.
Идея заключается в том, что пользователи входят на сервер, который идентифицирует их (используя cookies в их браузере).
После аутентификации ваша страница (reactive js) делает запрос к серверу аутентификации, который, если пользователь подтверждает, возвращает токен доступа, используемый для аутентификации последующих REST-запросов.
Вы можете использовать сторонний сервис аутентификации, такой как Google. В этом случае вы можете следовать этому видеоруководству, которое проведет вас через основы настройки проекта Google API для аутентификации запросов вашего приложения.
Альтернативно, вы можете преобразовать ваш сервер WordPress в OAuth сервер с помощью существующего плагина, такого как WP-OAuth Server, и его подробной документации.

Лучший способ "войти" пользователя на сайте — использовать стандартную форму входа WordPress. Как уже упоминалось в других комментариях и ответах, реализация входа так, как подразумевается в заголовке вопроса, потребует изобретения велосипеда. Форма входа WordPress, помимо самого входа, также предоставляет обратную связь при неудачной попытке входа и предлагает процесс восстановления пароля.
Даже если вы создаёте полностью "безголовый" (headless) WordPress, вам стоит хорошо подумать, стоит ли усилий переизобретение формы входа.
Если же вы имеете в виду аутентификацию пользователя с другого домена, это просто не будет работать, так как куки устанавливаются только для домена сайта (насколько я помню).
Единственный допустимый вариант использования — это сервер-серверное взаимодействие, при котором вам нужно сохранять куки, полученные при "входе", и повторно использовать их в последующих запросах. Но это подразумевает хранение логина и пароля на вашем сервере, и в таком случае использование паролей приложений может быть лучшим решением.

Плохие вопросы получают не самые лучшие ответы. В ретроспективе, автор, вероятно, хотел узнать, залогинен ли пользователь, но отправка REST-запроса только для этого вряд ли будет оптимальным способом.

Пароли приложений WordPress (введены в WordPress 5.6) позволяют осуществлять доступ к API через HTTP Basic Authentication. Для аутентификации запросов используются ваше имя пользователя WordPress и сгенерированный пароль приложения (который можно найти в профиле пользователя).
Точные шаги
Войти в админку WordPress: Откройте панель администратора WordPress (например, https://your-wordpress-site.com/wp-admin).
Перейти в профиль: В левом меню нажмите на "Пользователи", а затем "Профиль" (или "Ваш профиль").
Найти раздел "Пароли приложений": Прокрутите вниз до раздела "Пароли приложений".
Сгенерировать новый пароль приложения: Введите описательное имя для нового приложения (например, "Python App"). Нажмите кнопку "Добавить новый пароль приложения". Важно: сразу скопируйте сгенерированный пароль, так как он больше не будет отображаться.
Использовать учетные данные для API-запросов: Используйте ваше имя пользователя WordPress и сгенерированный пароль приложения для аутентификации через HTTP Basic Authentication. Библиотека requests с HTTPBasicAuth автоматически закодирует эти учетные данные в Base64.
Пример кода на Python:
import requests
from requests.auth import HTTPBasicAuth
# Замените на URL вашего сайта WordPress, имя пользователя и сгенерированный пароль приложения
site_url = "https://your-wordpress-site.com"
username = "your_username"
app_password = "your_application_password"
# Пример: GET запрос для получения постов
get_url = f"{site_url}/wp-json/wp/v2/posts"
response = requests.get(get_url, auth=HTTPBasicAuth(username, app_password))
print("GET response:", response.json())
# Пример: POST запрос для создания нового поста с данными
post_url = f"{site_url}/wp-json/wp/v2/posts"
data = {
"title": "Hello World",
"content": "This post was created via the REST API with an application password.",
"status": "publish"
}
response = requests.post(post_url, json=data, auth=HTTPBasicAuth(username, app_password))
print("POST response:", response.json())
