PHP CURL на аутентифицированный сайт, когда уже вошли в систему - PullRequest
0 голосов
/ 09 августа 2011

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

В частности, это страницы, на которые я уже вошел в систему , поэтому я предположил, что стандартный запрос cURL со всеми моими установленными в данный момент файлами cookie будет работать, но это не так. Первоначально я получаю ответ 302, но если установить для параметра «FOLLOWLOCATION» значение true, я окажусь на странице входа в систему сайта, а не на той странице, которую я хотел.

$client = curl_init();

//curl_setopt($client, CURLOPT_HEADER, true);
curl_setopt($client, CURLOPT_RETURNTRANSFER, true);
curl_setopt($client, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($client, CURLOPT_URL, $pageToLoad);     

/* Supposedly libcurl loads all cookies auto-magically if you don't set CURL_COOKIESESSION
if (isset($_SERVER['HTTP_COOKIE'])) {
  curl_setopt($client, CURLOPT_COOKIE, $_SERVER['HTTP_COOKIE']);
}
*/

$response = curl_exec($client);
curl_close($client);

У меня такое чувство, что мне нужно установить файл cookiejar, чтобы это работало («тонет», потому что у моего сценария нет прав на запись на сервере dev), но что вы думаете?

EDIT: Так что, будучи своего рода идиотом, оказалось, что у меня есть некоторые права на запись ... в любом случае, я сделал временную папку в моем домашнем каталоге, где я убедился, что мой скрипт может написать:

$fname = '/home/temp/cookies.txt';
if( $save = fopen($fname, 'w') ) {
  fwrite($save, 'testing');
}

Запустите скрипт, и вот, в первом тесте появится «тестирование».
Я добавил следующие 2 строки в мой запрос cURL:

curl_setopt($ch, CURLOPT_COOKIEJAR, '/home/temp/cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, '/home/temp/cookies.txt');

И ничего не изменилось в моем сценарии. Файл cookies.txt по-прежнему просто говорит «тестирование» и в нем не хранятся файлы cookie, а также не изменяется время «последнего доступа», что для меня означает, что эти строки ничего не делают.

Есть еще мысли? Я немного озадачен: \

Ответы [ 3 ]

1 голос
/ 09 августа 2011

Вот мой любимый шаблон для таких задач:

$loginUrl = 'http://www.remote_site.de/login.php';
$loginFields = array('username' => 'username', 'password' => 'password');

getUrl($loginUrl, 'post', $loginFields); 
//now you're logged in and a session cookie was generated

$remote_page_content = getUrl('http://www.remote_site.de/some_page.php');


  function getUrl($url, $method='', $vars='') {
    $ch = curl_init();
    if ($method == 'post') {
      curl_setopt($ch, CURLOPT_POST, 1);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
    }
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
    curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt');
    $buffer = curl_exec($ch);
    curl_close($ch);
    return $buffer;
  }
1 голос
/ 09 августа 2011

Да, вам понадобятся оба варианта CURLOPT_COOKIEFILE и CURLOPT_COOKIEJAR.версия «файл» - это то, откуда загружать куки.jar - это место, где куки должны быть сохранены, когда объект curl завершен.Это может быть один и тот же файл.

Если у вас нет прав записи на сервере для создания фактического файла (очень странно, если у вас не было хотя бы разрешения на запись в / tmp или эквивалентном), выможно использовать файл памяти с помощью php://memory оболочки .

0 голосов
/ 17 августа 2011

Итак, я вынул необработанный код cURL, который у меня был, и скопировал в какой-то специфичный для Zend код из другого проекта, и это, похоже, сработало по большей части (не совсем понятно, почему ...). Единственные другие проблемы, с которыми я столкнулся, касаются CoSign (http://cosign.sourceforge.net/) и использования прокси-файлов cookie. Спасибо тем, кто предложил ответы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...