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

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

http://api.example.com/login//

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

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

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

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)

Вот как вы делаете 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
Но если мне нужно сохранить сессию тогда?
 trainoasis03 мар. 2014 г., 08:41
Можно ли установить cookie в качестве переменной (я не хочу передавать файл каждый раз)?
 John23 окт. 2012 г., 21:34
Doh! Можно'Не думаю, что я пропустил этот вариант, он имеет смысл. Спасибо!
 drew01004 мар. 2014 г., 00:33
@trainoasis Посмотреть вариантCURLOPT_COOKIE

но вы также должны установить "CURLOPT_COOKIEFILE» (Чтение)

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

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