Це насправді не питання, а посібник про те, як зробити аутентифіковані запити до API Wordpress за допомогою JWT. Я пишу це як нагадування собі та тим, кому, можливо, потрібна допомога з тієї ж теми.
Це насправді не питання, а посібник про те, як зробити аутентифіковані запити до API Wordpress за допомогою JWT. Я пишу це як нагадування собі та тим, кому, можливо, потрібна допомога з тієї ж теми.
Відповіді:
Чому автентифікація JWT
Я будую сайт, який використовує Wordpress як бек-енд, а додаток React + Redux як передній, тому я перетягую весь вміст у передній частині, роблячи запити до API Wordpress. Деякі запити (головним чином, POST-запити) повинні бути засвідчені автентичністю, що коли я натрапив на JWT.
Що нам потрібно
Щоб використовувати автентифікацію JWT з Wordpress, спочатку нам потрібно встановити модуль JWT Authentication для 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, звільнити листоношу та подати запит на 'індекс' за замовчуванням API Wordpress:
http://example.com/wp-json/
Кілька нових кінцевих точок, таких як /jwt-auth/v1
і /jwt-auth/v1/token
повинні були бути додані в API. Якщо ви можете знайти їх у відповіді на вищезазначений запит, це означає, що JWT тепер доступний.
Отримання маркера JWT
Зупинімось у листоноші на даний момент, і запитаємо маркер до API Wordpress:
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)
Нарешті, на вкладці "Тіло" виберіть необроблені та JSON (додаток / 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"
Де $ token - це маркер, повернутий функцією getToken () вище.
Я особисто використовую плагін " Вимкнути API REST та вимагати автентифікацію JWT / OAuth ", щоб обмежити доступ до API лише за допомогою маркера вище.