Авторизация в 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