Как получить текущий зарегистрированный пользователь, используя Wordpress Rest Api?

Я попытался добавить пользовательский запрос.

add_action('rest_api_init', function () {
    register_rest_route( 'custom', '/login', array(
        'methods' => 'GET',
        'callback' => function(WP_REST_Request $request) {
            return wp_get_current_user();
        }
    ));
});

Но он всегда возвращает пользователя с ID = 0; Я также пробовал это:

add_action('rest_api_init', function () {
    register_rest_route( 'custom', '/login', array(
        'methods' => 'GET',
        'callback' => function(WP_REST_Request $request) {
            return is_user_logged_in();
        }
    ));
});

И он всегда возвращает false. Но пользователь вошел в систему, чтобы убедиться.

Я добавил свой пользовательский логин

add_action('rest_api_init', function () {
    register_rest_route( 'custom', '/login', array(
        'methods' => 'POST',
        'callback' => function(WP_REST_Request $request) {
            $nonce = wp_create_nonce("wp_rest");
            $user = wp_signon(array('user_login' => $_POST['username'],
                'user_password' => $_POST['password'], "rememberme" => true), false);
            if (is_wp_error($user)) {
                return $user;
            }

            //do_action( 'wp_login', "capad" );
            //$user['isloggedin'] = is_user_logged_in();
            return array('user' => $user,
                'nonce' => $nonce);
        }
    ));
});

И я добавляю "X-WP-Nonce" в качестве заголовка для http-запроса

И теперь каждый запрос выводит: {"code":"rest_cookie_invalid_nonce","message":"Cookie nonce is invalid","data":{"status":403}}

Ответ 1

В главе Authentication в Справочнике API REST:

Проверка подлинности файлов cookie - это основной метод проверки подлинности, включенный в WordPress. Когда вы входите в свою панель управления, это устанавливает файлы cookie правильно для вас, поэтому разработчикам плагинов и тем нужно только иметь зарегистрированный пользователь.

Однако REST API включает в себя метод, называемый nonces, чтобы избежать CSRF вопросы. Это предотвращает принуждение других сайтов выполнять действия без явно намереваясь сделать это. Для этого требуется обработка для API.

Для разработчиков, использующих встроенный Javascript API, это обрабатывается автоматически для вас. Это рекомендуемый способ использования API для плагинов и тем. Модели пользовательских данных могут расширять wp.api.models.Base чтобы гарантировать, что это отправлено правильно для любых пользовательских запросов.

Для разработчиков, выполняющих ручные запросы Ajax, nonce нужно будет с каждым запросом. API использует nonces с действием, установленным для wp_rest. Затем они могут быть переданы API через данные _wpnonce(либо POST-данные, либо запрос запроса GET), либо через заголовок X-WP-Nonce.

Здесь пример GET:

https://example.tld/wp-json/wp/v2/users/me?_wpnonce=9467a0bf9c

или в вашем случае:

https://example.tld/wp-json/custom/login/?_wpnonce=9463a0bf9c

где nonce создается из

wp_create_nonce( 'wp_rest' );

Итак, вы, скорее всего, забыли о nonce part при тестировании вашей конечной точки.

Надеюсь, что это поможет!

Ответ 2

Если вы предпочитаете использовать аутентификацию JWT для WP REST API, это может быть проще реализовать с помощью веб-токенов Json.

Сначала вы аутентифицируете клиента, отправляющего HTTP-запрос POST конечной точке /wp-json/jwt-auth/v1/token, отправляющего поля имени пользователя и пароля для создания токена авторизации.

Успешный ответ будет похож на:

{
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9qd3QuZGV2IiwiaWF0IjoxNDM4NTcxMDUwLCJuYmYiOjE0Mzg1NzEwNTAsImV4cCI6MTQzOTE3NTg1MCwiZGF0YSI6eyJ1c2VyIjp7ImlkIjoiMSJ9fX0.YNe6AyWW4B7ZwfFE5wJ0O6qQ8QFcYizimDmBy6hCH_8",
    "user_display_name": "admin",
    "user_email": "[email protected]",
    "user_nicename": "admin"
}

Затем вы передаете токену каждого запроса настройки заголовка запроса Авторизация, например:

Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9qd3QuZGV2IiwiaWF0IjoxNDM4NTcxMDUwLCJuYmYiOjE0Mzg1NzEwNTAsImV4cCI6MTQzOTE3NTg1MCwiZGF0YSI6eyJ1c2VyIjp7ImlkIjoiMSJ9fX0.YNe6AyWW4B7ZwfFE5wJ0O6qQ8QFcYizimDmBy6hCH_8

Ответ 3

1. Установите и активируйте плагин JWT Authentication для WP REST API, а также установите плагин WP REST API
2. Теперь вы можете запустить любой API WordPress по умолчанию из мобильного приложения или любого другого источника или почтальона. например, нажмите этот URL из вашего приложения или почтальона. https://example.com/wp-json/wp/v2/posts
3. Приложением или почтальоном. Когда вы войдете в систему с действительными данными (используя rest api), вы получите токен. Чтобы войти и получить токен, запустите следующий URL почтальоном или приложением https://example.com/wp-json/jwt-auth/v1/token
4. Таким образом, вы получите токен, как показано на рисунке postman and jwt authentication
Теперь используйте этот токен, чтобы войти в данные пользователя, например
5. сделать функцию в function.php

function checkloggedinuser()
{
$currentuserid_fromjwt = get_current_user_id();
print_r($currentuserid_fromjwt);
exit;
}

 add_action('rest_api_init', function ()
{
  register_rest_route( 'testone', 'loggedinuser',array(
  'methods' => 'POST',
  'callback' => 'checkloggedinuser'
  ));
});


6. Теперь снова запустите этот новый URL в почтальоне или в приложении, чтобы войти в данные пользователя. https://example.com/wp-json/testone/loggedinuser (замените example.com вашим URL) enter image description here

Ответ 4

Я провел два дня в поисках простого способа без добавления плагинов.

сначала в function.php, где вы определяете свой API

//enqueue the script which will use the api
function api_callings_scripts() {
    wp_enqueue_script('score-script', get_template_directory_uri() . '/js/ScoreSaving.js', ['jquery'], NULL, TRUE);
    // Pass nonce to JS.
    wp_localize_script('score-script', 'ScoreSettings', [
      'nonce' => wp_create_nonce('wp_rest'),
    ]);
}
add_action( 'wp_enqueue_scripts', 'api_callings_scripts' ); 

Тогда ваш скрипт Ajax call cloud будет примерно таким

jQuery.ajax({
      type: "POST",
      url: "/wp-json/score/update",
      data: {"var1":"value1"},
      beforeSend: function(xhr) {
        xhr.setRequestHeader('X-WP-Nonce', ScoreSettings.nonce);
      },
    success: 
        function( data ) {
          console.log( data );
        }
    });

Теперь вы можете использовать get_current_user_id() внутри вашего кода API.