Как использовать WordPress REST API для входа пользователя?

25 сент. 2021 г., 02:37:55
Просмотры: 16.3K
Голосов: 2

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

3
Комментарии

Вы можете создать пользовательскую конечную точку, затем в вашем API-запросе включить имя пользователя и пароль, после чего вызвать wp_authenticate() в вашей конечной точке для проверки учетных данных. Но соединение всегда должно использовать https (безопасный протокол), так как вы будете отправлять пароль в открытом виде. И вы действительно пробовали какой-либо код, читали какие-либо туториалы/статьи?

Sally CJ Sally CJ
25 сент. 2021 г. 04:47:39

@SallyCJ Какой метод я должен использовать для отправки данных? Также, как будет выглядеть функция?

jeffinter jeffinter
25 сент. 2021 г. 06:57:36

API может использоваться из любого приложения (JS, PHP, cURL, Postman, Python и т.д.) путем отправки базовых HTTP-запросов. Например, на фронтенде (или неадминистративной стороне) сайта WordPress вы можете использовать клиент Backbone.js или wp.apiFetch().

Sally CJ Sally CJ
25 сент. 2021 г. 07:50:40
Все ответы на вопрос 4
0

Добавьте код в 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 );

    }
10 янв. 2024 г. 13:44:47
0

Существует 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, и его подробной документации.

25 сент. 2021 г. 14:40:30
3

Лучший способ "войти" пользователя на сайте — использовать стандартную форму входа WordPress. Как уже упоминалось в других комментариях и ответах, реализация входа так, как подразумевается в заголовке вопроса, потребует изобретения велосипеда. Форма входа WordPress, помимо самого входа, также предоставляет обратную связь при неудачной попытке входа и предлагает процесс восстановления пароля.

Даже если вы создаёте полностью "безголовый" (headless) WordPress, вам стоит хорошо подумать, стоит ли усилий переизобретение формы входа.

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

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

25 сент. 2021 г. 15:42:06
Комментарии

Не отвечает на вопрос.

Aurovrata Aurovrata
28 дек. 2022 г. 07:13:38

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

Mark Kaplun Mark Kaplun
28 дек. 2022 г. 15:20:34

если только это не кросс-доменный запрос, в таком случае может возникнуть целый набор проблем, если что-то подобное будет реализовано

Mark Kaplun Mark Kaplun
28 дек. 2022 г. 15:45:05
0

Пароли приложений 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())
5 мар. 2025 г. 16:50:31