curlopt_url - php curl ssl
Mantener viva la sesiĆ³n con Curl y PHP (4)
Estoy tratando de conectarme a una API, autenticar a un usuario y luego ver los detalles del usuario. Esto se logra al acceder primero al punto final de inicio de sesión en
http://api.example.com/login/<username>/<password>
para iniciar sesión y luego lo siguiente para ver los detalles del usuario:
http://api.example.com/user/
Todo esto funciona en un navegador web. Sin embargo, una vez que trato de utilizar Curl, el inicio de sesión funciona bien, pero cuando intento ver los detalles del usuario, obtengo un error 401 no autorizado. Creo que esto se debe a que Curl no está guardando las cookies de sesión correctamente. ¿Puede alguien señalar por qué no funciona y cómo solucionarlo? Intenté buscar intercambio de pila, pero ninguna de las soluciones que he probado ha funcionado para mi situación. El código que estoy usando para curvar los puntos finales se muestra a continuación. ¡Gracias!
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);
Este código dará como resultado:
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!"}
Así es como haces CURL con sesiones
//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);
}
Lo he visto en ImpressPages
Ha utilizado correctamente "CURLOPT_COOKIEJAR" (escritura) pero también debe configurar "CURLOPT_COOKIEFILE" (lectura)
curl_setopt ($ch, CURLOPT_COOKIEJAR, COOKIE_FILE);
curl_setopt ($ch, CURLOPT_COOKIEFILE, COOKIE_FILE);
Sí, a menudo llamado ''cookie jar'', Google debería proporcionar muchos ejemplos:
http://devzone.zend.com/16/php-101-part-10-a-session-in-the-cookie-jar/
http://curl.haxx.se/libcurl/php/examples/cookiejar.html <- buen ejemplo en mi humilde opinión
Copiando el último aquí para que no se vaya ...
Inicie sesión en una página y luego obtenga otra página que pase todas las cookies desde la primera página junto Escrito por 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);
?>
También debe configurar la opción CURLOPT_COOKIEFILE
.
El manual describe esto como
El nombre del archivo que contiene los datos de la cookie. El archivo de cookies puede estar en formato Netscape, o simplemente encabezados de estilo HTTP descargados en un archivo. Si el nombre es una cadena vacía, no se cargan cookies, pero el manejo de cookies aún está habilitado.
Como está utilizando el contenedor de cookies, termina guardando las cookies cuando finalizan las solicitudes, pero dado que no se proporciona CURLOPT_COOKIEFILE
, cURL no envía ninguna de las cookies guardadas en solicitudes posteriores.