Поддержание сессии с помощью Curl и PHP

Я пытаюсь подключиться к API, аутентифицировать пользователя, а затем просмотреть информацию о пользователе. Это достигается путем доступа к конечной точке входа в систему по адресу

http://api.example.com/login/<username>/<password>

войти в систему, а затем следующее для просмотра информации о пользователе:

http://api.example.com/user/

Это все работает в веб-браузере. Однако, как только я пытаюсь использовать Curl, вход в систему работает нормально, но при попытке просмотреть информацию о пользователе я получаю 401 несанкционированную ошибку. Я полагаю, это потому, что Керл не сохраняет куки сессии правильно? Может кто-то указать, почему это не работает и как это исправить? Я попытался найти обмен стека, однако ни одно из решений, которые я пробовал, не сработало для моей ситуации. Код, который я использую для скручивания конечных точек, показан ниже. Спасибо!

define("COOKIE_FILE", "cookie.txt");

// Login the user
$ch = curl_init('http://api.example.com/login/joe/smith');
curl_setopt ($ch, CURLOPT_COOKIEJAR, COOKIE_FILE); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
echo curl_exec ($ch);

// Read the session saved in the cookie file
echo "<br/><br/>";
$file = fopen("cookie.txt", 'r');
echo fread($file, 100000000);   
echo "<br/><br/>";

// Get the users details
$ch = curl_init('http://api.example.com/user');
curl_setopt ($ch, CURLOPT_COOKIEJAR, COOKIE_FILE); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
echo curl_exec ($ch);

Этот код выведет:

HTTP/1.1 200 OK Date: Mon, 22 Oct 2012 21:23:57 GMT Server: LiteSpeed Connection: close X-Powered-By: PHP/5.3.14 Set-Cookie: cfapi=f481129c9616b8f69cc36afe16466545; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Type: application/json X-Powered-By: CFWAPI 0.1a Content-Length: 46 {"status":200,"msg":"Successfully Logged In."}

# Netscape HTTP Cookie File # http://curl.haxx.se/rfc/cookie_spec.html # This file was generated by libcurl! Edit at your own risk. api.example.com FALSE   /   FALSE   0   cfapi 94f63b07ccf7e34358c1c922341c020f 

HTTP/1.1 401 Unauthorized Date: Mon, 22 Oct 2012 21:23:57 GMT Server: LiteSpeed Connection: close X-Powered-By: PHP/5.3.14 Set-Cookie: cfapi=a8eb015a7c423dde95aa01579c4729a4; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Type: application/json X-Powered-By: CFWAPI 0.1a Content-Length: 49 {"status":401, "msg":"You need to login first!"}

Ответы на вопрос(4)

CURLOPT_COOKIEJAR" (запись), но вам также необходимо установить "CURLOPT_COOKIEFILE" (чтение)

curl_setopt ($ch, CURLOPT_COOKIEJAR, COOKIE_FILE); 
curl_setopt ($ch, CURLOPT_COOKIEFILE, COOKIE_FILE); 
 waza12331 авг. 2016 г., 22:29
спасибо, спас мой день с разбором

Вот как вы делаете CURL с сессиями

//initial request with login data

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/login.php');
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/32.0.1700.107 Chrome/32.0.1700.107 Safari/537.36');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "username=XXXXX&password=XXXXX");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIESESSION, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie-name');  //could be empty, but cause problems on some hosts
curl_setopt($ch, CURLOPT_COOKIEFILE, '/var/www/ip4.x/file/tmp');  //could be empty, but cause problems on some hosts
$answer = curl_exec($ch);
if (curl_error($ch)) {
    echo curl_error($ch);
}

//another request preserving the session

curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/profile');
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, "");
$answer = curl_exec($ch);
if (curl_error($ch)) {
    echo curl_error($ch);
}

Я видел это на ImpressPages

 AntonioCS06 авг. 2016 г., 21:24
Здесь вы не создаете новое соединение. Вы используете то же соединение.

часто называемый «банкой печенья», Google должен предоставить много примеров:

http://devzone.zend.com/16/php-101-part-10-a-session-in-the-cookie-jar/

http://curl.haxx.se/libcurl/php/examples/cookiejar.html <- хороший пример ИМХО

Копирование этого последнего здесь, чтобы оно не ушло ...

Войдите в систему на одной странице, а затем получите другую страницу, пропуская все файлы cookie с первой страницы Автор: Митчелл

<?php
/*
This script is an example of using curl in php to log into on one page and 
then get another page passing all cookies from the first page along with you.
If this script was a bit more advanced it might trick the server into 
thinking its netscape and even pass a fake referer, yo look like it surfed 
from a local page.
*/

$ch = curl_init();
curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/cookieFileName");
curl_setopt($ch, CURLOPT_URL,"http://www.myterminal.com/checkpwd.asp");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "UserID=username&password=passwd");

ob_start();      // prevent any output
curl_exec ($ch); // execute the curl command
ob_end_clean();  // stop preventing output

curl_close ($ch);
unset($ch);

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/cookieFileName");
curl_setopt($ch, CURLOPT_URL,"http://www.myterminal.com/list.asp");

$buf2 = curl_exec ($ch);

curl_close ($ch);

echo "<PRE>".htmlentities($buf2);
?>  
 Gacci30 сент. 2017 г., 08:43
Это все еще не работает для меня!
 AntonioCS06 авг. 2016 г., 21:35
У меня были проблемы с CURLOPT_COOKIEJAR и CURLOPT_COOKIEFILE. Я думал, что должен был всегда использовать оба. Как только я следовал вашему коду, все, что я пытался сделать, сработало! Спасибо!
Решение Вопроса

CURLOPT_COOKIEFILE.

Руководство описывает это как

Имя файла, содержащего данные cookie. Файл cookie может быть в формате Netscape или просто в виде простых заголовков в стиле HTTP, выгруженных в файл. Если имя является пустой строкой, файлы cookie не загружаются, но обработка файлов cookie все еще включена.

Поскольку вы используете файл cookie, вы в конечном итоге сохраняете файлы cookie по окончании запросов, но посколькуCURLOPT_COOKIEFILE не предоставляется, cURL не отправляет ни один из сохраненных файлов cookie при последующих запросах.

 Sila Khatun11 мая 2016 г., 05:07
Но если мне нужно сохранить сессию тогда?
 drew01004 мар. 2014 г., 00:33
@trainoasis Посмотреть вариантCURLOPT_COOKIE
 trainoasis03 мар. 2014 г., 08:41
Можно ли установить cookie в качестве переменной (я не хочу передавать файл каждый раз)?
 John23 окт. 2012 г., 21:34
Doh! Не могу поверить, что я пропустил этот вариант, это имеет смысл. Спасибо!

Ваш ответ на вопрос