#javascript #php #basic-authentication
#javascript #php #базовая аутентификация
Вопрос:
Я знаю, что есть много вопросов и ответов по этой теме, но пока у меня ничего не получалось.
Я делаю межсайтовый HTTP-запрос с помощью Javascript / XMLHttpRequest с моего компьютера на мой сервер (Ubuntu / Apache / PHP 7.4):
var client = new XMLHttpRequest();
client.open('GET', src, true, username, password);
client.withCredentials = true;
Заголовки, отправленные моим PHP-скриптом:
function print_headers($content_type) {
$referer = $_SERVER['HTTP_REFERER'] ? $_SERVER['HTTP_REFERER'] : '*';
if (substr($referer, strlen($referer) - 1) == '/') {
$referer = substr($referer, 0, strlen($referer) - 1);
}
header("Access-Control-Allow-Origin: " . $referer);
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Methods: GET");
header("Access-Control-Allow-Headers: authorization,content-type");
header($content_type);
}
Он работает без базовой аутентификации, для базовой аутентификации я не могу получить имя пользователя / пароль от PHP_AUTH_USER и PHP_AUTH_PW (они пусты):
$username = $_SERVER[‘PHP_AUTH_USER’];
$password = $_SERVER[‘PHP_AUTH_PW’];
Часто рекомендуется использовать этот RewriteRule в конфигурации Apache или htaccess:
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
и в PHP:
list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':' , base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
Это не работает. Конфигурация Apache для моего сайта:
<Directory "/var/www/my.site.com/">
RewriteEngine on
#RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
RewriteBase /
RewriteRule ^(?!admin).*$ index.php
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
SSLOptions StdEnvVars
SSLRequireSSL
</Directory>
Любой совет?
Ответ №1:
Вы пытались добавить заголовок в свой запрос xhr? Нравится:
client.setRequestHeader("Authorization", "Basic " btoa("username:password"));
Комментарии:
1. Я добавил эту строку, и Chrome сообщает: «заблокирован политикой CORS: ответ на предполетный запрос не проходит проверку контроля доступа: у него нет статуса HTTP ok»
2. тогда что-то не так с конфигурацией cors на стороне сервера, попробуйте изменить заголовок на
header("Access-Control-Allow-Origin: *");