Например, PHP Digest HTTP Authentication не работает, почему?

Итак, я решил использовать дайджест HTTP-аутентификацию для моего REST API. Я просмотрел его и нашел запись в руководстве PHP с примером того, как это сделать. Поэтому я копирую script, помещаю его в index.php на свой сервер, открываю страницу в браузере, после ввода моих учетных данных браузер запрашивает их снова, и я застрял в бесконечном цикле ввода учетных данных. script приведен ниже и может быть найден здесь.

Пример # 7 Пример дайджест HTTP-аутентификации

<?php
$realm = 'Restricted area';

//user => password
$users = array('admin' => 'mypass', 'guest' => 'guest');


if (empty($_SERVER['PHP_AUTH_DIGEST'])) {
    header('HTTP/1.1 401 Unauthorized');
    header('WWW-Authenticate: Digest realm="'.$realm.
           '",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"');

    die('Text to send if user hits Cancel button');
}


// analyze the PHP_AUTH_DIGEST variable
if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) ||
    !isset($users[$data['username']]))
    die('Wrong Credentials!');


// generate the valid response
$A1 = md5($data['username'] . ':' . $realm . ':' . $users[$data['username']]);
$A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);
$valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);

if ($data['response'] != $valid_response)
    die('Wrong Credentials!');

// ok, valid username & password
echo 'Your are logged in as: ' . $data['username'];


// function to parse the http auth header
function http_digest_parse($txt)
{
    // protect against missing data
    $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1);
    $data = array();
    $keys = implode('|', array_keys($needed_parts));

    preg_match_all('@(' . $keys . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER);

    foreach ($matches as $m) {
        $data[$m[1]] = $m[3] ? $m[3] : $m[4];
        unset($needed_parts[$m[1]]);
    }

    return $needed_parts ? false : $data;
}
?>

Я также попробовал базовую аутентификацию и отлично работал.

Пример # 6 Пример базового HTTP-аутентификации

<?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>";
}
?>

Кажется, что $_SERVER['PHP_AUTH_DIGEST'] всегда пуст.

Есть ли что-то не так с script, или это моя среда фанки, и если да, то как это исправить?

EDIT: В script нет ничего плохого. Ошибка связана с сервером. Если кто-нибудь знает, что может это сделать, сообщите мне.

Ответ 1

Дайджест-аутентификация - это отдельный модуль Apache, который часто не устанавливается на серверах - особенно с дешевыми хостинговыми компаниями. Это должно быть включено, чтобы использовать его, хотя.

http://httpd.apache.org/docs/current/mod/mod_auth_digest.html

Это зависит от вашего дистрибутива, как его установить, если вы используете Linux. На моем Ubuntu Linux было достаточно, чтобы создать символическую ссылку модуля из папки деактивированных модулей на активированные модули one запустить sudo a2enmod auth_digest в оболочке. Это и перезапуск Apache, конечно.

Я не знаю о Windows.

Ответ 2

У вас есть mod_headers, загруженный в Apache (я предполагаю, что ваш сервер запускает Apache)?

Вы можете понять это, используя следующую командную строку (для выполнения которой могут потребоваться привилегии):

httpd -M | grep head