Авторизація у REST API
У REST API є публічні та приватні кінцеві точки. Приватні вимагають, щоб користувач був авторизований та мав відповідні права на виконання дії. Аутентифікація REST API виконується під час запиту.
Аутентифікація за cookies
Авторизація за куками – це стандартний метод аутентифікації в WordPress. Користувач вводить свій логін/пароль, на основі яких створюється кука (і зберігається в браузері). А далі по цій куці WP щоразу перевіряє чи авторизований користувач.
До версії 5.6 це був єдиний метод авторизації REST API доступний в WordPress за замовчуванням. Після того, з’явилися ще Паролі додатків .
Для авторизації за куками в REST запит обов’язково потрібно передавати nonce-код . Потрібно це для безпеки від атак Cross-Site Request Forgery (CSRF) . Такий підхід необхідний лише обробки запитів, яким потрібні особливі права, наприклад, запит видалення/зміна записи, рубрики тощо.
Якщо використовувати вбудований Javascript API
То можна забути про nonce-код, тому що API у цьому випадку все робить за вас. Це рекомендований метод використовувати запити до REST API при створенні плагінів і тим, то можна бути впевненим, що будь-який запит буде надіслано правильно. Базу wp.api.models.Base можна розширювати.
Якщо використовувати довільні запити AJAX
То потрібно самому передавати nonce код при кожному запиті. Для створення такого nonce коду потрібно використовувати ключ wp_rest
– wp_create_nonce( ‘wp_rest’ ) .
Nonce-код можна передати через:
_wpnonce
— Виберіть GET/POST запит.X-WP-Nonce
– HEADER параметр заголовка запиту.
Приклади дивіться нижче.
Якщо правильний nonce-код НЕ вказаний, то REST API вважатиме що авторизації НІ – current_user=0
, навіть якщо користувач авторизований самому сайті.
Примітка: так як PHP не переводить дані DELETE запиту в суперглобальний масив $_REQUEST , рекомендується вказувати nonce-код в заголовку запиту через X-WP-Nonce
.
Метод авторизації на куках працюватиме лише:
- при AJAX запитах – коли REST API використовується «всередині» WordPress.
- коли поточного користувача авторизовано на сайті.
- коли поточний користувач має достатні права для виконання зазначеної дії (наприклад, видалення/зміни посту).
Приклади встановлення nonce-коду для кастомних AJAX запитів:
#1 Як передавати nonce-код в запитах AJAX.
Допустимо ми згенерували nonce код функцією wp_create_nonce( ‘wp_rest’ ) і він дорівнює asdf654adsf
, тоді:
Передача у параметрі _wpnonce
:
// GET запит let fetch = fetch ( 'http://site/uri/?_wpnonce=asdf654adsf'); // POST запит let fetch = fetch ( 'http://site/uri/', { method: 'POST', body: new URLSearchParams( '_wpnonce=asdf654adsf&foo=bar' ) // body: new URLSearchParams( [ ...new FormData(formElement).entries() ] ) } ); // Post запит на jQuery let request = jQuery.ajax( 'http://site/uri/', { method: "POST", data: { _wpnonce: "asdf654adsf", foo: "bar" } } );
Передача в заголовку X-WP-Nonce
:
// fetch запит let fetch = fetch ( 'http://site/uri/', { method: 'POST', headers: { 'X-WP-Nonce': 'asdf654adsf' }, body: new URLSearchParams( 'foo=bar' ) } ); // jQuery запит let request = jQuery.ajax( 'http://site/uri/', { method: "POST", headers: { 'X-WP-Nonce': 'asdf654adsf' }, data: { foo: "bar" } } );
#1.2 Як створювати та передавати nonce-код.
Створимо nonce-код і посилання на REST API, і додамо ці дані в HTML, щоб потім їх використовувати:
wp_localize_script( 'my-js-file', 'REST_API_data', array( 'root' => esc_url_raw( rest_url() ), 'nonce' => wp_create_nonce( 'wp_rest' ) )));
Тепер використовуємо створені дані у JS коді.
Змінимо заголовок посту 1. Для цього використовується маршрут /wp/v2/posts/{id}
:
jQuery.ajax( { url : REST_API_data.root + 'wp/v2/posts/1', method : 'POST', beforeSend : function ( xhr ) { xhr.setRequestHeader( 'X-WP-Nonce', REST_API_data.nonce ); }, data : { 'title' : 'Новий заголовок' } } ) .done( function ( response ) { console.log(response); } );
Перевіряти nonce-код при обробці кінцевої точки не потрібно. REST API робить це автоматично. Докладніше див. rest_cookie_check_errors() .
Інші способи аутентифікації
Коли потрібен інший метод авторизації, наприклад для роботи з сайтом із сторонньої програми, використовуйте:
- Паролі додатків — вбудована в ядро можливість.
- Плагін: OAuth 1.0a Server
- Плагін: JSON Web Tokens