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

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

Пример # 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 . ')=(?:(['"])([^]+?)|([^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'] всегда есть пуста.

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

EDIT: в сценарии нет ничего плохого. Вина лежит на сервере. Если кто-нибудь знает, что может вызвать это, пожалуйста, дайте мне знать.

2 ответов


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

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

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

Я не знаю о Windows.


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

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

httpd -M | grep head