WordPress как на ладони
Шаблоны, плагины и темы для настоящих поклонников Elementor. От TemplateMonster.com wordpress jino

Авторизация

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

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

Это пока единственный метод авторизации в REST API доступный в WordPress по умолчанию (из коробки).

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

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

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

Разработчики использующие произвольные AJAX запросы, должны сами передавать 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()

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

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

  • OAuth 1.0a Server
  • Application Passwords
  • JSON Web Tokens
  • Basic Authentication — это самый простой способ включить «удаленную» авторизацию. Однако имейте ввиду, что для работы этого плагина вам нужно будет передавать логин и пароль при каждом запросе, а это не безопасно! Поэтому использование этого плагина рекомендуется только для тестов, для разработки.

Почему авторизация может не работать?

Если вы отправляете заголовки аутентификации (Authentication headers), но запрос не принимается и у вас используется Apache в среде CGI, это значит что Apache возможно вырезает заголовки. Попробуйте добавить следующий код в файл конфигурации Apache или в файл .htaccess:

<IfModule mod_setenvif>
	SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
</IfModule>

Basic аутентификация

При базовой аутентификации клиент вместе с запросом отправляет серверу логин и пароль. Эти данные отправляются в заголовке запроса Authorization в виде base64 кода:

Authorization: Basic base64_encode(username:password)

Так например, если логин и пароль у нас admin, нужно добавить такой заголовок:

Authorization: Basic YWRtaW46YWRtaW4=

Так как base64 очень просто раскодировать, такой метод совершенно небезопасен и может быть использован только для разработки или тестов.

Для включения возможности базовой авторизации нужно установить WordPress плагин Basic Authentication.

Basic Авторизация в программе Postman

  1. Перейдите во вкладку Authorization;
  2. Выберите метод аутентификации Basic Auth;
  3. Укажите логин и пароль;
  4. Все! Отправляйте авторизованные запросы.

Basic Авторизация через WP HTTP API

$response = wp_remote_request( 'http://wptest.ru/wp-json/wp/v2/posts/113',
	array(
		'method'    => 'DELETE',
		'headers'   => array(
			'Authorization' => 'Basic ' . base64_encode( 'username:password' )
		)
	)
);

if( 200 == wp_remote_retrieve_response_code( $response ) )
	echo 'Пост удален!';
else
	echo 'Ошибка: Не удалось удалить пост';

Смотрите также: WP HTTP API

Basic Авторизация через JavaScript

Такая авторизация нужна только если отправляется AJAX запрос с одного сайта на другой. Если AJAX запрос происходит внутри сайта, и пользователь уже авторизован, то вместе с запросом будут отправлены куки аутентификации, а это значит что авторизация уже есть, нужно только указать nonce-код (см. выше).

$.ajax({
	url: 'http://wptest.ru/wp-json/wp/v2/posts/113',
	method: 'DELETE',
	crossDomain: true,
	beforeSend: function ( xhr ) {
		xhr.setRequestHeader( 'Authorization', 'Basic ' + Base64.encode( 'username:password' ) );
	},
	success: function( data, txtStatus, xhr ) {
		console.log( data );
		console.log( xhr.status );
	}
});

Basic Авторизация через командную строку

curl -X DELETE http://wptest.ru/wp-json/wp/v2/posts/113 -H 'Authorization: Basic a2FtYTprYW1h'
Комментариев нет
    Здравствуйте, !     Войти . Зарегистрироваться