En gardant session vivant avec Curl et PHP
Je suis en train d'essayer de se connecter à une API, pour authentifier un utilisateur et afficher les détails de l'utilisateur. Ceci est accompli par le premier accès à la connexion d'extrémité à
http://api.example.com/login/<username>/<password>
pour vous connecter et ensuite la commande suivante pour afficher les détails de l'utilisateur:
http://api.example.com/user/
Tout cela fonctionne dans un navigateur web. Cependant, une fois que j'essaie d'utiliser Curl, la connexion fonctionne bien, mais lorsque vous essayez d'afficher les détails de l'utilisateur, je remonte un 401, erreur non autorisée. Je crois que c'est parce que Curl n'est pas l'enregistrement de la session les cookies correctement? Quelqu'un peut-il rappeler pourquoi il ne fonctionne pas et comment le résoudre? J'ai essayé de chercher stack exchange, cependant, aucune des solutions que j'ai essayé ont travaillé pour ma situation. Le code que j'utilise pour recourber les extrémités est indiqué ci-dessous. Merci!
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);
Ce code de sortie:
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!"}
Vous devez vous connecter pour publier un commentaire.
Vous devez également définir l'option
CURLOPT_COOKIEFILE
.Le manuel décrit cela comme
Puisque vous utilisez la jarre à biscuits vous finissez par sauver les cookies lorsque les demandes de finition, mais depuis le
CURLOPT_COOKIEFILE
n'est pas donné, cURL n'est pas d'envoyer tout de la les cookies enregistrés sur les demandes ultérieures.CURLOPT_COOKIE
Vous avez correctement utilisés "CURLOPT_COOKIEJAR" (écrire), mais vous devez également définir "CURLOPT_COOKIEFILE" (lecture)
C'est comment vous faites CURL, avec des séances
J'ai vu cela sur ImpressPages
Yup, souvent appelé "cookie jar" Google devrait fournir de nombreux exemples:
http://devzone.zend.com/16/php-101-part-10-a-session-in-the-cookie-jar/
http://curl.haxx.se/libcurl/php/examples/cookiejar.html <- un bon exemple à mon humble avis
De copie de cette dernière ici, donc il ne va pas plus loin...