Question

J'écris un client C ++ qui utilise libcurl pour communiquer avec un script PHP.

La communication doit être basée sur la session. La première tâche est donc de vous connecter et de faire en sorte que le script PHP configure une session.

Je ne suis pas habitué à travailler avec des sessions de C ++ ou de PHP. Je sais en gros que cela concerne les cookies et l'identifiant de session qui communique.

Je ne trouve aucun exemple sur la page d'accueil Curl qui illustre un cas d'utilisation simple de la gestion de session.

Je suppose que cela a quelque chose à voir avec une ou plusieurs des options suivantes de curl:

CURLOPT_COOKIE
CURLOPT_COOKIEFILE
CURLOPT_COOKIEJAR
CURLOPT_COOKIESESSION
CURLOPT_COOKIELIST

Mais je ne peux pas vraiment avoir une vue d'ensemble de la documentation de CURLOPT_COOKIESESSION, par exemple.

Quiconque a fait cela, veuillez partager un simple morceau de code qui montre le concept.

Cordialement

Robert

Était-ce utile?

La solution

Pour autant que je sache, CURL gérera automatiquement les cookies de session si vous activez les cookies, à condition que vous réutilisiez votre identifiant CURL pour chaque demande de la session:

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

Je ne suis pas sûr que vous ayez besoin de définir COOKIEFILE et COOKIEJAR, mais la documentation en donne l'impression. Dans tous les cas, vous devez définir l'un des deux afin d'activer les cookies dans CURL. Vous pouvez faire quelque chose d'aussi simple que:

curl_easy_setopt( Handle, CURLOPT_COOKIEFILE, "" );

Cela ne lira aucun cookie à partir du disque, mais cela autorisera les cookies de session pour la durée du traitement de la boucle.

Autres conseils

J'ai un exemple de commande curl à la ligne de commande sous bash - je me connecte à PHPMyAdmin, puis j'utilise sa fonction d'exportation. Peut-être que cela vous aidera:

#!/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 utilise des jetons en plus des cookies, ce qui rend le code un peu plus compliqué que nécessaire.

Une session en PHP a pour but de préserver un état sur plusieurs requêtes, puisque HTTP est en soi sans état. Pour obtenir une session PHP, il vous suffit de demander une page php qui démarre une session et de conserver le cookie que vous récupérez pour les requêtes suivantes.

Démarrer une session en php est simple - appelez la fonction session_start (). Cette fonction reprendra une session existante si le cookie existe dans la requête. Lorsque la session est démarrée, les variables persistantes peuvent être définies à l'aide du tableau superglobal $ _SESSION. C'est une bonne idée de stocker un jeton 'est connecté' ici =). Pour mettre fin à la session PHP, définissez $ _SESSION sur array (), afin que le jeton soit détruit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top