WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Платформа для конвертации и монетизации трафика

Авторизация в REST API

В REST API есть публичные и приватные конечные точки. Приватные требуют, чтобы пользователь был авторизован и имел соответствующие права на выполнения действия. Аутентификация в REST API выполняется во время запроса.

Аутентификация по cookies

Авторизация по кукам — это стандартный метод аутентификации в WordPress. Пользователь вводит свой логин/пароль, на основе них создается кука (и сохраняется в браузере). А дальше по этой куке WP каждый раз проверяет авторизован ли пользователь.

До версии 5.6 это был единственный метод авторизации в REST API доступный в WordPress по умолчанию. После появились еще Пароли приложений.

Для авторизации по кукам в REST запросе обязательно нужно передавать nonce-код. Нужно это для безопасности от атак Cross-Site Request Forgery (CSRF). Такой подход нужен только для обработки запросов, которым нужны особые права, например, запрос на удаление/изменение записи, рубрики и т.д.

Если использовать встроенный Javascript API, то можно забыть про nonce-технологию, так как она в этом случае работает автоматически. Это рекомендуемый метод использовать REST API при создании плагинов и тем, с ним можно быть уверенным, что любой запрос будет отправлен правильно. Базу wp.api.models.Base можно расширять.

Если использовать произвольные AJAX запросы, то нужно самому передавать nonce-код при каждом запросе. Для создания такого nonce-кода нужно использовать ключ wp_rest. nonce-код можно передать через:

  • _wpnonce — параметр GET/POST запроса.
  • X-WP-Nonce — HEADER параметр заголовка запроса.

Если правильный nonce-код НЕ указан, то REST API будет считать что авторизации НЕТ - current_user=0, даже если юзер авторизован на самом сайте.

Заметка: так как PHP не переводит данные DELETE запроса в суперглобальный массив $_REQUEST, рекомендуется указывать nonce-код в заголовке запроса — через X-WP-Nonce.

Метод авторизации на куках будет работать только:

  • когда REST API используется внутри WordPress (при AJAX запросах).
  • когда текущий пользователь авторизован на сайте.
  • когда у текущего пользователя есть достаточные права для выполнения указанного действия (например, удаления/изменения поста).

Примеры

#1 Как нужно создавать и передавать nonce-код при AJAX запросах.

Создадим данные:

wp_localize_script( 'my-js-file', 'REST_API_data', array(
	'root'  => esc_url_raw( rest_url() ),
	'nonce' => wp_create_nonce( 'wp_rest' )
) );

Теперь используем созданные данные в JS коде:

options.beforeSend = function(xhr) {
	xhr.setRequestHeader( 'X-WP-Nonce', REST_API_data.nonce );

	if ( beforeSend ) {
		return beforeSend.apply( this, arguments );
	}
};
#2 Изменим заголовок записи, через jQuery AJAX и REST API

В этом примере изменим заголовок поста 1. Для этого используется маршрут /wp/v2/posts/{id}:

$.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().

Другие способы аутентификации

Когда нужен другой метод авторизации, например для работы с сайтом из стороннего приложения, используйте:

6 комментов
    Войти