2013-02-27 2 views
3

Так немного мелочи первый ..PHP NTLM сессии с Curl

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

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

кода я получил до сих пор:

$cookie_file_path = dirname(__FILE__) . '/cookies.txt'; 
    $ch = curl_init(); 

    //============================================================== 
    curl_setopt($ch, CURLOPT_USERPWD, $username. ':' . $password); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
    curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($ch, CURLINFO_HEADER_OUT, true); 
    curl_setopt($ch, CURLOPT_FAILONERROR, 0); 
    curl_setopt($ch, CURLOPT_MAXREDIRS, 100); 
    //============================================================= 
    $ret = curl_exec($ch); 

Над код входит в целевом сайт по Curl (который управляет NTLM рукопожатием, как это кажется), и выбирает веб-сайты содержания. Он также сохраняет идентификатор сеанса, который отправляется обратно в файл cookie.

Что я пытаюсь сделать дальше, это комментарий опции CURLOPT_USERPWD, в надежде, что этот скрипт будет использовать идентификатор сеанса, хранящийся в файле cookie, для аутентификации ранее зарегистрированного пользователя во втором выполнении этого скрипта. Он может избавиться от пользовательских учетных данных и не хранить его нигде таким образом, потому что хранить его в ручном сеансе, базе данных или в другом месте небезопасно.

Мне нужно это, потому что бот будет использовать CRON, чтобы периодически проверять, изменился ли статус сайта и выполнить некоторые действия пользователя в качестве реакции на это. Но для этого сначала должен быть аутентифицирован пользователь, а его имя пользователя и пароль не должны храниться в любом месте, поэтому я должен использовать информацию сеанса, установленную при его первоначальном входе в систему.

CURL, похоже, НЕ ДЕЛАЕТ ЭТО. Когда я выполняю скрипт второй раз с комментарием CURLOPT_USERPWD, он не использует сохраненный файл cookie для проверки подлинности. Вместо этого он REWRITES файл cookie с не относящимися к делу данными отправляет мне из службы в качестве ответа на NOT AUTHRORISED запрос доступа.

Мои вопросы: Почему cURL не использует хранимую информацию сеанса для проверки подлинности? Есть ли способ сохранить этот сеанс с веб-сайтом cURL и NTLM?

Заранее спасибо.

ответ

1

Несколько месяцев назад у меня была аналогичная проблема, чем вы. Я попытался подключиться к мылу api. Navision использует аутентификацию ntlm. Проблема в том, что curl не поддерживает native ntlm, поэтому вам нужно сделать это самостоятельно.

блог пост, который мне очень помог в этой ситуации было следующее:

http://rabaix.net/en/articles/2008/03/13/using-soap-php-with-ntlm-authentication

** Редактировать

К сожалению я неправильно вас вопрос. У вас проблема проста.

Просто получить заголовок из запроса с этой линией

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

Вы можете получить из результата curl_exec функции, заголовок Set-Cookie.

preg_match('/^Set-Cookie:\s*([^;]*)/mi', $ret, $match); 
$cookie = parse_url($match[0]); 

Теперь вы можете сохранить его где-нибудь и использовать его по запросу 2ten.

+0

Ну, не то, что я искал, потому что моя проблема заключается не в том, чтобы обрабатывать аутентификацию, а в том, чтобы обрабатывать и поддерживать сеанс, поэтому пароль и имя пользователя можно было отбросить после входа в систему. –

+0

Спасибо за ответ, но эта часть, как я сказал в своем посте, тоже сделал. cURL автоматически сохраняет информацию о сеансе в файле cookie. У меня уже включен CURLOPT_RETURNTRANSFER, так как он указан в моем списке кодов. Проблема в том, что, как я сказал в своем посте, ОТПРАВИТЬ ИНФОРМАЦИЮ ОБ ОБРАТНОЙ СВЯЗИ во втором запросе. Перечисленный мной сценарий не делает этого, несмотря на то, что у него есть информация о сеансе, хранящаяся в файле cookie. Мне не нужно сохранять cookie из заголовка ответа вручную с помощью регулярного выражения, потому что cURL делает это автоматически. Он просто не использует его во втором запросе. –

1

У меня такая же проблема, и я решил это с помощью строки кода curl_setopt($ch, CURLOPT_COOKIEFILE, "");. Строка должна быть точно пустым.