Як: Зробити запити, підтверджені JWT, до API Wordpress


17

Це насправді не питання, а посібник про те, як зробити аутентифіковані запити до API Wordpress за допомогою JWT. Я пишу це як нагадування собі та тим, кому, можливо, потрібна допомога з тієї ж теми.


3
Ви повинні відформатувати це як питання, а потім опублікувати рішення як фактичну відповідь. Інакше це виглядає як питання без відповіді.
Джейкоб Пітті

2
Є також цей чудовий путівник firxworx.com/blog/wordpress/…
Армандо

Відповіді:


19

Чому автентифікація 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


2
Як би ви відрізнили дзвінки, які повинні бути аутентифіковані, і такі, які не повинні бути автентифіковані в бек-енді?
урук

Я також будую додаток React, який витягує дані публікацій із бази даних WordPress за допомогою API WordPress REST, однак я не хочу, щоб кінцеві точки API REST були загальнодоступними. Чи існує спосіб обмежити доступ до API REST за винятком мого додатка 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"

Де $ token - це маркер, повернутий функцією getToken () вище.

Я особисто використовую плагін " Вимкнути API REST та вимагати автентифікацію JWT / OAuth ", щоб обмежити доступ до API лише за допомогою маркера вище.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.