2012-10-22 14 views
40

Ich versuche, eine Verbindung zu einem API, authentifizieren Sie einen Benutzer und dann die Benutzerdetails anzeigen. Dies wird durch die ersten Zugriff auf den Login-Endpunkt beiKeeping Session lebendig mit Curl und PHP

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

anmelden und dann dem folgenden anzuzeigen Benutzerdaten:

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

Das alles funktioniert in einem Web-Browser. Sobald ich jedoch versuche, Curl zu verwenden, funktioniert die Anmeldung einwandfrei, aber beim Versuch, Benutzerdetails anzuzeigen, erhalte ich einen 401, nicht autorisierten Fehler. Ich glaube, das liegt daran, dass Curl die Sitzungscookies nicht richtig speichert? Kann jemand darauf hinweisen, warum es nicht funktioniert und wie man es repariert? Ich habe versucht, den Stack-Austausch zu suchen, aber keine der Lösungen, die ich ausprobiert habe, hat für meine Situation funktioniert. Der Code, den ich verwende, um die Endpunkte zu krümmen, wird unten gezeigt. Vielen Dank!

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

Dieser Code wird ausgegeben:

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

Antwort

25

Sie müssen auch CURLOPT_COOKIEFILE die Option einzustellen.

Das Handbuch beschreibt dies als

Der Name der Datei, um die Cookie-Daten enthält. Die Cookie-Datei kann im Netscape-Format sein, oder einfach nur HTTP-style-Header, die in eine -Datei ausgegeben werden. Wenn der Name eine leere Zeichenfolge ist, werden keine Cookies geladen, aber Cookie-Behandlung ist weiterhin aktiviert.

Da Sie die Keksdose Sie die Cookies am Ende sparen verwenden, wenn die Anforderungen beenden, aber da die CURLOPT_COOKIEFILE nicht gegeben ist, wird cURL nicht auf nachfolgende Anfragen jeder der gespeicherten Cookies zu senden. Diese

+0

Doh! Ich kann nicht glauben, dass ich diese Option verpasst habe, es macht durchaus Sinn. Vielen Dank! – John

+0

ist es möglich, den Cookie als Variable zu setzen (ich möchte nicht jedes Mal eine Datei übergeben)? – trainoasis

+0

@trainoasis Siehe Option 'CURLOPT_COOKIE' – drew010

9

Yup, oft ein 'Keksdose' genannt Google sollte viele Beispiele geben:

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

http://curl.haxx.se/libcurl/php/examples/cookiejar.html < - IMHO gutes Beispiel

Kopieren dass letzte hier so ist es nicht weggeht ...

Login auf einer Seite und erhalten dann eine andere Seite alle Cookies von der ersten Seite, die entlang Geschrieben von Mitchell

<?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

Ich habe Probleme mit dem CURLOPT_COOKIEJAR und CURLOPT_COOKIEFILE haben. Ich dachte, ich müsste immer beides benutzen. Sobald ich Ihrem Code gefolgt bin, hat das, was ich versucht habe, funktioniert! Vielen Dank! – AntonioCS

+0

Es funktioniert immer noch nicht für mich! – Gacci

23

Sie richtig eingesetzt „CURLOPT_COOKIEJAR“ haben (Schreiben), aber Sie müssen auch „CURLOPT_COOKIEFILE“ (Lesen) gesetzt

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

danke, speicherte meinen Tag mit Parsing – waza123

9

ist, wie Sie mit Sitzungen kein Einrollen

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

ich dies auf ImpressPages gesehen habe

+0

Hier erstellen Sie keine neue Verbindung. Sie verwenden dieselbe Verbindung. – AntonioCS