За последние 24 часа нас посетили 17923 программиста и 1566 роботов. Сейчас ищут 1306 программистов ...

http Аутентификация и CGI версия PHP

Тема в разделе "Установка PHP", создана пользователем mahmuzar, 4 авг 2013.

  1. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Столкнулся с такой проблемой. Установлен php как CGI и не проходит HTTP аутентификация. Читал на одном форуме, что для cgi-версии http-аутентификация отключена.
    Так вот, у меня вопрос, можно ее как то включить?
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    Дай пример кода и описание условий а) когда работает, б) когда не работает (как именно не работает).
    Если не сможешь, значит и проблемы нет.
     
  3. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    artoodetoo, добрый день.
    Пример с этого же форума.
    И так, форма аутентификации запускается, предлагает ввести логин и пароль, после того как я ввожу логин и пароль браузер заново загружает скрипт и проверяет условие, если пара логин и пароль введены верно, пользователь проходит аутентификацию, в противном случае, срабатывает код другого условного оператора.

    Как работает код на моем сервере:
    В моем случае, программа при введении данных заново требует ввести данные. какие бы не вводил.
    Код (Text):
    1.  
    2. <?php
    3. $realm = 'Запретная зона';
    4.  
    5. //user => password
    6. $users = array('admin' => 'mypass', 'guest' => 'guest');
    7.  
    8.  
    9. if (empty($_SERVER['PHP_AUTH_DIGEST'])) {
    10.     header('HTTP/1.1 401 Unauthorized');
    11.     header('WWW-Authenticate: Digest realm="'.$realm.
    12.            '",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"');
    13.  
    14.     die('Текст, посылаемый, если пользователь нажал Cancel');
    15. }
    16.  
    17.  
    18. // анализируем переменную PHP_AUTH_DIGEST
    19. if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) ||
    20.     !isset($users[$data['username']]))
    21.     die('Неправильные данные!');
    22.  
    23.  
    24. // генерируем корректный ответ
    25. $A1 = md5($data['username'] . ':' . $realm . ':' . $users[$data['username']]);
    26. $A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);
    27. $valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);
    28.  
    29. if ($data['response'] != $valid_response)
    30.     die('Неправильные данные!');
    31.  
    32. // ok, логин и пароль верны
    33. echo 'Вы вошли как: ' . $data['username'];
    34.  
    35.  
    36. // функция разбора заголовка http auth
    37. function http_digest_parse($txt)
    38. {
    39.     // защита от отсутствующих данных
    40.     $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1);
    41.     $data = array();
    42.     $keys = implode('|', array_keys($needed_parts));
    43.  
    44.     preg_match_all('@(' . $keys . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER);
    45.  
    46.     foreach ($matches as $m) {
    47.         $data[$m[1]] = $m[3] ? $m[3] : $m[4];
    48.         unset($needed_parts[$m[1]]);
    49.     }
    50.  
    51.     return $needed_parts ? false : $data;
    52. }
    53. ?>
    Мне в этом коде все понятно, когда что он должен выводить.
    Думаю каждый кто занимается программированием знает что такое http-аутентификация, так же и я.
    И так, вопрос я изначально не так ставил, вопрос таков:
    Это правда? Помогите в этом разобраться, а в самом коде аутентификации я разберусь.
    http://php.ru/manual/features.http-auth.html вот и пример, который приводится на этом же форуме.
    И почему все решили что я прошу решить задачу за меня?
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    Нет. Теперь пусть на другом форуме проверят мои слова.
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    когда возникают такие мистические ситуации проще все снести и сделать заново
     
  6. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Спасибо. Я не проверял слова, реально у меня не работал код, погуглил, вышел на тот форум
    Так и сделаю
     
  7. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Нужно точно знать конфигурацию сервиса. Какой веб-сервер, есть ли какие-то враперы и т.п. Часто соответствующие заголовки не проходят просто до PHP, например, suexec может резать.
     
  8. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    MiksIr, доброго времени суток. Кажись так и есть. Но враперов нету.
    Но видно, что скрипт не запускается при нажатии кнопки вход, а вот при нажатии отмена, скрипт читается браузером. и выводится соответствующее сообщение.
    Код (Text):
    1. die('Текст, посылаемый, если пользователь нажал Cancel');
     
  9. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Ответ нашел: Заголовок запроса аутентификации дол-жен идти перед HTML-кодом, поэтому данный прием не будет работать
    в CGI-версии интерпретатора PHP.

    Источник книга: Изучаем PHP и MySQL , Мишел Е. Дэвис Джон А. Филлипс
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ob_start() попробуй