Domanda

Sto scrivendo un client C ++ che utilizza libcurl per comunicare con uno script PHP.

La comunicazione dovrebbe essere basata sulla sessione, quindi il primo compito è quello di accedere e fare in modo che lo script PHP crei una sessione.

Non sono abituato a lavorare con sessioni in C ++ o PHP. So sostanzialmente che ha a che fare con i cookie e con l'ID della sessione di comunicazione.

Non riesco a trovare alcun esempio nella homepage di curl che dimostri un semplice caso d'uso della gestione della sessione.

Suppongo che abbia qualcosa a che fare con una o più delle seguenti opzioni in arricciatura:

CURLOPT_COOKIE
CURLOPT_COOKIEFILE
CURLOPT_COOKIEJAR
CURLOPT_COOKIESESSION
CURLOPT_COOKIELIST

Ma non riesco davvero a vedere il quadro generale solo dalla documentazione di CURLOPT_COOKIESESSION per esempio.

Chiunque l'abbia fatto, per favore condividi un semplice pezzo di codice che mostra il concetto.

Saluti

Robert

È stato utile?

Soluzione

Per quanto ne so, CURL gestirà automaticamente i cookie di sessione se abiliti i cookie, purché riutilizzi l'handle CURL per ogni richiesta nella sessione:

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

Non sono sicuro che sia necessario impostare sia COOKIEFILE che COOKIEJAR, ma la documentazione lo fa sembrare così. In ogni caso, devi impostare uno dei due per abilitare i cookie in CURL. Puoi fare qualcosa di semplice come:

curl_easy_setopt( Handle, CURLOPT_COOKIEFILE, "" );

Che non leggerà alcun cookie dal disco, ma abiliterà i cookie di sessione per la durata dell'handle del ricciolo.

Altri suggerimenti

Ho un esempio di arricciatura della riga di comando in bash: accedendo a PHPMyAdmin e quindi usando la sua funzione di esportazione. Forse ti aiuterà:

#!/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 utilizza token oltre ai cookie, quindi il codice è un po 'più complicato del normale.

Una sessione in PHP ha lo scopo di preservare un certo stato su diverse richieste, poiché HTTP in sé è senza stato. Per ottenere una sessione da PHP, richiedi semplicemente una pagina php che avvia una sessione e mantieni il cookie che ricevi per le richieste successive.

L'avvio di una sessione in php è semplice: chiama la funzione session_start (). Tale funzione riprenderà una sessione esistente se il cookie esiste nella richiesta. All'avvio della sessione, è possibile impostare variabili persistenti utilizzando l'array superglobal $ _SESSION. È una buona idea archiviare un token 'è connesso' lì =) Per terminare la sessione PHP, impostare $ _SESSION su array (), in modo che il token venga distrutto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top