Базовая аутентификация с PHP дает бесконечный цикл - PullRequest
7 голосов
/ 08 февраля 2011

По какой-то причине я не могу заставить Basic Authentication работать на моем сервере с использованием PHP. Я использую точный код со страницы руководства:

<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="My Realm"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'Text to send if user hits Cancel button';
    exit;
} else {
    echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
    echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
}
?>

Однако, когда я запускаю его, я никогда не могу выйти за рамки приглашения.

Если я помещу этот же код на другой сервер, он будет работать нормально.

Кто-нибудь знает, что может быть причиной этого? Оба сервера являются стеками WAMP, и в Apache включен auth_basic_module. Файлы PHP.ini также практически идентичны.

Я посмотрел на заголовки, и после того, как я ввел свое имя пользователя / пароль, отправляется заголовок «Authorization: Basic XXXXXX».

1 Ответ

9 голосов
/ 08 февраля 2011

Это зависит от используемого интерфейса PHP.Переменная окружения PHP_AUTH_USER используется только для mod_php, и если Apache помог.

Если вы инициализируете авторизацию из скрипта, вам придется искать заголовок HTTP_AUTHORIZATION, а также декодировать и разбивать его самостоятельно,Посмотрите на этот комментарий: http://www.php.net/manual/en/features.http-auth.php#94349

Для установок FastCGI или вызовов suexec у вас может даже не быть этого заголовка в переменных среды.Это отфильтровано в качестве меры безопасности.Обычный обходной путь - переписать заголовок, используя правило .htaccess:

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

Таким образом, он становится доступным в смешанном регистре как $_SERVER["HTTP_Authorization"].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...