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