PHP и базовая аутентификация

#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: *");