Столкнулся с такой проблемой. Установлен php как CGI и не проходит HTTP аутентификация. Читал на одном форуме, что для cgi-версии http-аутентификация отключена. Так вот, у меня вопрос, можно ее как то включить?
Дай пример кода и описание условий а) когда работает, б) когда не работает (как именно не работает). Если не сможешь, значит и проблемы нет.
artoodetoo, добрый день. Пример с этого же форума. И так, форма аутентификации запускается, предлагает ввести логин и пароль, после того как я ввожу логин и пароль браузер заново загружает скрипт и проверяет условие, если пара логин и пароль введены верно, пользователь проходит аутентификацию, в противном случае, срабатывает код другого условного оператора. Как работает код на моем сервере: В моем случае, программа при введении данных заново требует ввести данные. какие бы не вводил. Код (Text): <?php $realm = 'Запретная зона'; //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('Текст, посылаемый, если пользователь нажал Cancel'); } // анализируем переменную PHP_AUTH_DIGEST if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) || !isset($users[$data['username']])) die('Неправильные данные!'); // генерируем корректный ответ $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('Неправильные данные!'); // ok, логин и пароль верны echo 'Вы вошли как: ' . $data['username']; // функция разбора заголовка http auth function http_digest_parse($txt) { // защита от отсутствующих данных $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; } ?> Мне в этом коде все понятно, когда что он должен выводить. Думаю каждый кто занимается программированием знает что такое http-аутентификация, так же и я. И так, вопрос я изначально не так ставил, вопрос таков: Это правда? Помогите в этом разобраться, а в самом коде аутентификации я разберусь. http://php.ru/manual/features.http-auth.html вот и пример, который приводится на этом же форуме. И почему все решили что я прошу решить задачу за меня?
Спасибо. Я не проверял слова, реально у меня не работал код, погуглил, вышел на тот форум Так и сделаю
Нужно точно знать конфигурацию сервиса. Какой веб-сервер, есть ли какие-то враперы и т.п. Часто соответствующие заголовки не проходят просто до PHP, например, suexec может резать.
MiksIr, доброго времени суток. Кажись так и есть. Но враперов нету. Но видно, что скрипт не запускается при нажатии кнопки вход, а вот при нажатии отмена, скрипт читается браузером. и выводится соответствующее сообщение. Код (Text): die('Текст, посылаемый, если пользователь нажал Cancel');
Ответ нашел: Заголовок запроса аутентификации дол-жен идти перед HTML-кодом, поэтому данный прием не будет работать в CGI-версии интерпретатора PHP. Источник книга: Изучаем PHP и MySQL , Мишел Е. Дэвис Джон А. Филлипс