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
erreichthttp://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!"}
Doh! Ich kann nicht glauben, dass ich diese Option verpasst habe, es macht durchaus Sinn. Vielen Dank! – John
ist es möglich, den Cookie als Variable zu setzen (ich möchte nicht jedes Mal eine Datei übergeben)? – trainoasis
@trainoasis Siehe Option 'CURLOPT_COOKIE' – drew010