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 для проверки подлинности. Вместо этого он перезаписывает файл cookie с не соответствующими данными, отправляемыми мне из службы в качестве ответа на запрос NOT AUTHRORISED .

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

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

    Related of "PHP-сессия NTLM с cURL"

    Несколько месяцев назад у меня была такая же проблема, как и вы. Я попытался подключиться к мылу 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.

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