Pregunta

Estoy escribiendo un cliente C ++ que está usando libcurl para comunicarse con un script PHP.

La comunicación debe basarse en la sesión y, por lo tanto, la primera tarea es iniciar sesión y hacer que el script PHP configure una sesión.

No estoy acostumbrado a trabajar con sesiones desde C ++ o PHP. Básicamente sé que tiene que ver con las cookies y la identificación de la sesión de comunicación.

No puedo encontrar ningún ejemplo en la página de inicio de curl que demuestre un caso de uso de administración de sesión simple.

Supongo que tiene algo que ver con una o muchas de las siguientes opciones en curl:

CURLOPT_COOKIE
CURLOPT_COOKIEFILE
CURLOPT_COOKIEJAR
CURLOPT_COOKIESESSION
CURLOPT_COOKIELIST

Pero realmente no puedo ver el panorama completo solo de la documentación de CURLOPT_COOKIESESSION, por ejemplo.

Cualquiera que haya hecho esto, comparta un código simple que muestre el concepto.

Saludos

Robert

¿Fue útil?

Solución

Por lo que yo entiendo, CURL manejará las cookies de sesión automáticamente si habilita las cookies, siempre que reutilice su controlador CURL para cada solicitud en la sesión:

CURL *Handle = curl_easy_init();

// Read cookies from a previous session, as stored in MyCookieFileName.
curl_easy_setopt( Handle, CURLOPT_COOKIEFILE, MyCookieFileName );
// Save cookies from *this* session in MyCookieFileName
curl_easy_setopt( Handle, CURLOPT_COOKIEJAR, MyCookieFileName );

curl_easy_setopt( Handle, CURLOPT_URL, MyLoginPageUrl );
assert( curl_easy_perform( Handle ) == CURLE_OK );

curl_easy_setopt( Handle, CURLOPT_URL, MyActionPageUrl );
assert( curl_easy_perform( Handle ) == CURLE_OK );

// The cookies are actually saved here.
curl_easy_cleanup( Handle );

No estoy seguro de que necesite configurar COOKIEFILE y COOKIEJAR, pero la documentación lo hace parecer así. En cualquier caso, debe configurar uno de los dos para habilitar las cookies en CURL. Puedes hacer algo tan simple como:

curl_easy_setopt( Handle, CURLOPT_COOKIEFILE, "" );

Eso no leerá ninguna cookie del disco, pero habilitará las cookies de sesión mientras dure el control del curl.

Otros consejos

Tengo un ejemplo de línea de comando curl en bash: iniciar sesión en PHPMyAdmin y luego usar su función de exportación. Tal vez te ayude:

#!/bin/bash

PHPMYADMINURL="http://www.example.com/phpmyadmin/"

# Username and password, has to be URL-encoded
MYUSERNAME="username"
MYPASSWORD="password"

TMPCOOKIES="$(mktemp)" || exit 1

TOKEN=$(
        curl \
                --silent \
                --show-error \
                --data @- \
                --data "lang=en-utf-8" \
                --cookie-jar "$TMPCOOKIES" \
                --dump-header - \
                --url "$PHPMYADMINURL" \
                <<< "pma_username=$MYUSERNAME&pma_password=$MYPASSWORD" \
                | egrep 'token=[0-9a-h]+' \
                | head -1 \
                | sed -r 's/^(.*token=)([0-9a-h]+)(.*)/\2/' \
        ) || exit 1

curl \
       --cookie "$TMPCOOKIES" \
       --data "token=$TOKEN" \
       --data "export_type=server" \
       --data "what=sql" \
       --data "asfile=sendit" \
       --data "sql_data=something" \
       --data "sql_columns=something" \
       --data "sql_hex_for_blob=something" \
       --data "compression=gzip" \
       --url "$PHPMYADMINURL"export.php 1>&2 || exit 1

rm -f "$TMPCOOKIES" || exit 1

PHPMyAdmin usa tokens además de cookies, por lo que el código es un poco más complicado de lo que normalmente se necesita.

Una sesión en PHP tiene el propósito de preservar algún estado en varias solicitudes, ya que HTTP en sí mismo no tiene estado. Para obtener una sesión de PHP, simplemente solicite una página php que inicie una sesión y guarde la cookie que obtiene para solicitudes posteriores.

Iniciar una sesión en php es simple: llame a la función session_start (). Esa función reanudará una sesión existente si la cookie existe en la solicitud. Cuando se inicia la sesión, se pueden establecer variables persistentes utilizando la matriz superglobal $ _SESSION. Es una buena idea almacenar un token 'ha iniciado sesión' allí =) Para finalizar la sesión de PHP, configure $ _SESSION en array (), para que el token se destruya.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top