2012-10-22 8 views
40

Próbuję połączyć się z interfejsem API, uwierzytelnić użytkownika, a następnie wyświetlić szczegóły użytkownika. Osiąga się to przez pierwsze dostępu do końcowego logowania naUtrzymywanie sesji przy życiu dzięki Curl i PHP

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

się zalogować, a następnie po aby zobaczyć dane użytkownika:

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

To wszystko działa w przeglądarce internetowej. Jednak gdy spróbuję użyć Curl, logowanie działa dobrze, ale przy próbie wyświetlenia szczegółów użytkownika otrzymuję błąd 401, nieautoryzowany. Uważam, że dzieje się tak dlatego, że Curl nie zapisuje poprawnie plików cookie sesji? Czy ktoś może wskazać, dlaczego nie działa i jak to naprawić? Próbowałem przeszukiwać wymianę stosów, jednak żadne z rozwiązań, które wypróbowałem, nie zadziałało w mojej sytuacji. Kod, którego używam do zwijania punktów końcowych, pokazano poniżej. Dzięki!

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); 

Ten kod wyjściowy:

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!"} 

Odpowiedz

25

Należy również ustawić opcję CURLOPT_COOKIEFILE.

Instrukcja opisuje to jako

nazwa pliku zawierającego dane cookie. Plik cookie może być w formacie Netscape lub zwykłe nagłówki w stylu HTTP umieszczane w pliku . Jeśli nazwa jest pustym ciągiem, żadne pliki cookie nie są ładowane, ale obsługa plików cookie jest nadal włączona.

Ponieważ używasz jar skończyć się zapisywanie cookies kiedy zakończyć żądania, ale ponieważ CURLOPT_COOKIEFILE nie jest podana, cURL nie wysyła żadnej z zapisanych cookies na kolejne żądania.

+0

Doh! Nie mogę uwierzyć, że przegapiłem tę opcję, to ma sens. Dzięki! – John

+0

czy można ustawić plik cookie jako zmienną (nie chcę za każdym razem przesyłać pliku)? – trainoasis

+0

@trainoasis Zobacz opcję 'CURLOPT_COOKIE' – drew010

9

Tak, często nazywany 'Cookie Jar' Google powinno dostarczyć wielu przykładów:

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

http://curl.haxx.se/libcurl/php/examples/cookiejar.html < - dobrym przykładem IMHO

Kopiowanie że ostatni tutaj tak nie odejdzie ...

Zaloguj się na jednej stronie, a następnie dostać kolejną stronę przechodzącego wszystkie pliki cookie z pierwszej strony wzdłuż Wpisany przez Mitchella

<?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); 
?> 
+0

miałem problemy z CURLOPT_COOKIEJAR i CURLOPT_COOKIEFILE. Myślałem, że muszę zawsze używać obu. Jak tylko przestrzegałem twojego kodu, to, co próbowałem, działało! Dzięki! – AntonioCS

+0

To nadal nie działa dla mnie! – Gacci

23

Ty prawidłowo stosowane „CURLOPT_COOKIEJAR” (pisanie), ale trzeba także ustawić „CURLOPT_COOKIEFILE” (odczyt)

curl_setopt ($ch, CURLOPT_COOKIEJAR, COOKIE_FILE); 
curl_setopt ($ch, CURLOPT_COOKIEFILE, COOKIE_FILE); 
+1

dziękuje, zapisał mi dzień z parsowaniem – waza123

9

W ten sposób można nie Curl z sesji

//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); 
} 

widziałem to na ImpressPages

+0

Nie tworzysz nowego połączenia. Korzystasz z tego samego połączenia. – AntonioCS

Powiązane problemy