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

1 апр. 2018 г., 20:30:44
Просмотры: 39.7K
Голосов: 27

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

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

Вы должны оформить это как вопрос, а затем опубликовать решение в качестве ответа. В противном случае это выглядит как неотвеченный вопрос.

Jacob Peattie Jacob Peattie
2 апр. 2018 г. 10:26:03

Также есть это отличное руководство https://firxworx.com/blog/wordpress/using-the-wordpress-rest-api-with-jwt-authentication/

Way Too Simple Way Too Simple
15 февр. 2019 г. 20:16:17
Все ответы на вопрос 2
7
34

Почему 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'); // Замените 'your-top-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. Если вы видите их в ответе, значит JWT работает.

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

Останемся в Postman и запросим токен у WordPress API:

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

В ответе вы получите JWT токен — зашифрованный ключ, который выглядит примерно так:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODg4OFwvZm90b3Jvb20tbmV4dCIsImlhdCI6MTUyMjU5NzQ1MiwibmJmIjoxNTIyNTk3NDUyLCJleHAiOjE1MjMyMDIyNTIsImRhdGEiOnsidXNlciI6eyJpZCI6IjEifX19.hxaaT9iowAX1Xf8RUM42OwbP7QgRNxux8eTtKhWvEUM

Выполнение аутентифицированного запроса

Давайте попробуем изменить заголовок поста с ID 300 в качестве примера аутентифицированного запроса с JWT.

В Postman выберите метод POST и введите следующий эндпоинт:

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

Выберите No Auth во вкладке Authorization и добавьте следующее во вкладке Headers:

'Content-type': 'application/json', 
'Authorization': 'Bearer jwtToken' // Замените jwtToken на реальный токен (зашифрованный ключ выше)

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

{ "title": "ДА! Аутентифицированные запросы с JWT работают" }

Теперь можно нажать SEND. Проверьте вкладку response: значение ключа title должно измениться на ДА! Аутентифицированные запросы с JWT работают.

27 апр. 2018 г. 09:36:37
Комментарии

Как бы вы различали вызовы, которые должны быть аутентифицированы, и те, которые не требуют аутентификации на стороне бэкенда?

uruk uruk
11 июл. 2018 г. 23:59:05

Я также разрабатываю React-приложение, которое получает данные записей из базы данных WordPress через WordPress REST API, но я не хочу, чтобы конечные точки REST API были общедоступными. Есть ли способ ограничить доступ к REST API, кроме как для моего React-приложения?

Chris Chris
12 июл. 2018 г. 14:07:12

@chris Если вы хотите скрыть свои конечные точки от неавторизованных запросов, добавьте их под пространство имен jwt_auth, например так: register_rest_route( 'jwt-auth/v1', 'your_custom_endpoint .... Любые запросы к /jwt-auth/ будут требовать авторизации

InanisAtheos InanisAtheos
19 сент. 2019 г. 23:39:09

@uruk как только у вас есть JWT токен, я думаю, вы всегда можете его отправлять, поэтому вам не нужно различать, какой из них нужен, а какой нет.

Lai32290 Lai32290
2 мая 2020 г. 13:38:18

Насколько я вижу, этот плагин так давно не обновлялся, безопасно ли его использовать?

Lai32290 Lai32290
2 мая 2020 г. 13:39:26

@Lai32290 Этот плагин выглядит обновленным и, похоже, основан на плагине, упомянутом в этом вопросе: https://wordpress.org/plugins/jwt-auth/

epsilon42 epsilon42
12 окт. 2020 г. 07:14:08

@uruk вот как я реализовал различие между вызовами, которые требуют аутентификации, и теми, которые не требуют, без использования плагина: Как принудительно включить аутентификацию в REST API для страницы с парольной защитой, используя кастомную таблицу и fetch() без плагина

Jürgen Fink Jürgen Fink
7 июл. 2021 г. 19:14:11
Показать остальные 2 комментариев
0

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

/**
*   Генерация JWT токена для последующих вызовов API 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);

    # Учетные данные администратора
    curl_setopt($ch, CURLOPT_POSTFIELDS, "username=admin&password=Str0ngPass"); 

    // Получаем ответ сервера ...
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $server_output = curl_exec ($ch);
    if ($server_output === false) {
        die('Ошибка при получении JWT токена WordPress для интеграции с API.');
    }
    $server_output = json_decode($server_output);

    if ($server_output === null && json_last_error() !== JSON_ERROR_NONE) {
        die('Неверный ответ при получении JWT токена WordPress для интеграции с API.');
    }

    if (!empty($server_output->token)) {
        $this->token = $server_output->token; # Токен здесь
        curl_close ($ch);
        return true;
    } else {
        die('Неверный ответ при получении JWT токена WordPress для интеграции с API.');
    }
    return false;
}

После этого отправляйте запросы с заголовком: "Authorization: Bearer $token"

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

Лично я использую плагин "Disable REST API and Require JWT / OAuth Authentication" для ограничения доступа к API только с указанным выше токеном.

29 июл. 2018 г. 02:17:33