Basic аутентификация по паролю пользователя

С версии 5.6 Basic аутентификация была добавлена в ядро, только для авторизации нужно использовать не пароль пользователя, а Пароль приложения.

Если вам по каким-то причинам, все нужно использовать пароль пользователя для авторизации, то нужно будет установить плагин (читайте ниже). Однако, делать этого я не рекомендую, пользуйтесь лучше паролями приложений!

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

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

Authorization: Basic base64_encode(login:password)

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

Authorization: Basic YWRtaW46YWRtaW4=

Так как base64 очень просто раскодировать, такой метод совершенно небезопасен, поэтому обязательно нужно использовать HTTPS (SSL) соединение.

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

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

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

$response = wp_remote_request( 'http://example.com/wp-json/wp/v2/posts/113',
	[
		'method'    => 'DELETE',
		'headers'   => [
			'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://example.com/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://example.com/wp-json/wp/v2/posts/113 -H 'Authorization: Basic a2FtYTprYW1h'

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

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

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

С Версии WP 5.6 аналогичный код добавляется автоматически (строка 3):

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>