Как сделать запросы с аутентификацией JWT в Wordpress API

17

На самом деле это не вопрос, а руководство о том, как делать аутентифицированные запросы к API Wordpress с использованием JWT. Я пишу это как напоминание для себя и для тех, кому может понадобиться помощь по той же теме.

grazianodev
источник
3
Вы должны отформатировать это как вопрос, а затем опубликовать решение как фактический ответ. В противном случае это выглядит как вопрос без ответа.
Джейкоб Питти
2
Существует также это прекрасное руководство firxworx.com/blog/wordpress/…
Армандо

Ответы:

19

Почему аутентификация JWT

Я создаю сайт, который использует Wordpress в качестве внутреннего интерфейса, а приложение React + Redux в качестве внешнего интерфейса, поэтому я извлекаю весь контент внешнего интерфейса, отправляя запросы в Wordpress API. Некоторые запросы (в основном, запросы POST) должны быть аутентифицированы, когда я столкнулся с JWT.

Что нам нужно

Чтобы использовать аутентификацию JWT с Wordpress, сначала нужно установить плагин JWT Authentication for WP REST API . Как объясняется в инструкциях плагина, нам также нужно изменить некоторые основные файлы Wordpress. Особенно:

В файл .htaccess, включенный в корневую папку установки Wordpress, нам нужно добавить следующие строки:

RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]

В файл wp-config.php, также включенный в корневую папку установки Wordpress, нам нужно добавить следующие строки:

define('JWT_AUTH_SECRET_KEY', 'your-top-secret-key'); // Replace 'your-top-secret-key' with an actual secret key.
define('JWT_AUTH_CORS_ENABLE', true);

Тестирование, чтобы увидеть, доступен ли JWT

Чтобы убедиться, что теперь мы можем использовать JWT, запустите Postman и сделайте запрос к стандартному индексу Wordpress API:

http://example.com/wp-json/

Несколько новых конечных точек, таких как /jwt-auth/v1и /jwt-auth/v1/tokenдолжны были быть добавлены в API. Если вы можете найти их в ответе на вышеуказанный запрос, это означает, что JWT теперь доступен.

Получение токена JWT

Давайте пока остановимся на Postman и запросим токен для Wordpress API:

http://example.com/wp-json/jwt-auth/v1/token

Ответ будет содержать токен JWT, который является зашифрованным ключом и выглядит примерно так:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODg4OFwvZm90b3Jvb20tbmV4dCIsImlhdCI6MTUyMjU5NzQ1MiwibmJmIjoxNTIyNTk3NDUyLCJleHAiOjE1MjMyMDIyNTIsImRhdGEiOnsidXNlciI6eyJpZCI6IjEifX19.hxaaT9iowAX1Xf8RUM42OwbP7QgRNxux8eTtKhWvEUM

Создание аутентифицированного запроса

Попробуем изменить заголовок сообщения с идентификатором 300 в качестве примера аутентифицированного запроса с JWT.

В Postman выберите POST в качестве метода и введите следующую конечную точку:

http://example.com/wp-json/wp/v2/posts/300

Выберите «Нет аутентификации» на вкладке «Авторизация» и добавьте следующее на вкладке «Заголовки»:

'Content-type': 'application/json', 
'Authorization': 'Bearer jwtToken' // Replace jwtToken with the actual token (the encrypted key above)

Наконец, на вкладке Body выберите параметры raw и JSON (application / json), а затем в редакторе прямо под параметрами введите следующее:

{ "title": "YES! Authenticated requests with JWT work" }

Теперь вы можете нажать SEND. Посмотрите на вкладке ответа все данные о записи, которую мы запросили: значение для ключа заголовка теперь должно бытьYES! Authenticated requests with JWT work

grazianodev
источник
2
Как бы вы различали вызовы, которые должны быть аутентифицированы, и такие, которые не должны проходить аутентификацию в серверной части?
Урук
Я также создаю приложение React, которое извлекает данные постов из базы данных WordPress с помощью WordPress REST API, однако я не хочу, чтобы конечные точки REST API были общедоступными. Есть ли способ ограничить доступ к REST API, кроме моего приложения React?
Крис
@ Крис Если вы хотите , чтобы ваши конечные точки должны быть спрятаны от не авторизованных запросов, добавьте их в пространстве имен jwt_auth, то есть примерно так: register_rest_route( 'jwt-auth/v1', 'your_custom_endpoint ... . Все, что находится в / jwt-auth /, будет нуждаться в авторизации
Athoxx
4

Дополняя ответ @ grazianodev, вы получаете токен авторизации с помощью cURL:

/**
*   Generate a JWT token for future API calls to WordPress
*/
private function getToken() {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL,'https://site.localhost/wp-json/jwt-auth/v1/token');
    curl_setopt($ch, CURLOPT_POST, 1);

    # Admin credentials here
    curl_setopt($ch, CURLOPT_POSTFIELDS, "username=admin&password=Str0ngPass"); 

    // receive server response ...
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $server_output = curl_exec ($ch);
    if ($server_output === false) {
        die('Error getting JWT token on WordPress for API integration.');
    }
    $server_output = json_decode($server_output);

    if ($server_output === null && json_last_error() !== JSON_ERROR_NONE) {
        die('Invalid response getting JWT token on WordPress for API integration.');
    }

    if (!empty($server_output->token)) {
        $this->token = $server_output->token; # Token is here
        curl_close ($ch);
        return true;
    } else {
        die('Invalid response getting JWT token on WordPress for API integration.');
    }
    return false;
}

После этого отправьте ваши запросы с заголовком: «Авторизация: токен на предъявителя $»

Где $ token - это токен, возвращенный функцией getToken () выше.

Я лично использую плагин « Отключить REST API и требовать аутентификацию JWT / OAuth », чтобы ограничить доступ к API только с помощью токена выше.

Лукас Бустаманте
источник