На самом деле это не вопрос, а руководство о том, как делать аутентифицированные запросы к API Wordpress с использованием JWT. Я пишу это как напоминание для себя и для тех, кому может понадобиться помощь по той же теме.
На самом деле это не вопрос, а руководство о том, как делать аутентифицированные запросы к API Wordpress с использованием JWT. Я пишу это как напоминание для себя и для тех, кому может понадобиться помощь по той же теме.
Ответы:
Почему аутентификация 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
register_rest_route( 'jwt-auth/v1', 'your_custom_endpoint ...
. Все, что находится в / jwt-auth /, будет нуждаться в авторизации
Дополняя ответ @ 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 только с помощью токена выше.