Authentification et sessions avec CURL
S'authentifier et ouvrir une session via CURL / PHP
Ceci peut être utile pour requêter une page de site qui requière une authentification. Ici nous devons procéder en plusieurs étapes :
- Se connecter à son compte sur le site puis stocker les cookies de session,
- Requêter la page désirée en passant les cookies de session,
- Se déconnecter du site.
Pour illustrer cet exemple, j'ai pris un exemple très concret : vérifier si l'on a des nouveaux messages privés sur le forum alsacreations.fr.
<?php $timeout = 10; $alsa_username = ''; $alsa_password = ''; $cookies_file = __DIR__.'/cookies.txt'; /************************************************** Première requête : Connexion **************************************************/ $url = 'http://www.alsacreations.com/ident/login/'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); if (preg_match('`^https://`i', $url)) { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); } curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_NOBODY, true); // Forcer cURL à utiliser un nouveau cookie de session curl_setopt($ch, CURLOPT_COOKIESESSION, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, array( 'name' => $alsa_username, 'password' => $alsa_password, 'login-submit' => 'Connexion' )); // Fichier dans lequel cURL va écrire les cookies // (pour y stocker les cookies de session) curl_setopt($ch, CURLOPT_COOKIEJAR, $cookies_file); curl_exec($ch); curl_close($ch); /************************************************** Seconde requête : Récupération du contenu **************************************************/ $url = 'http://www.alsacreations.com'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); if (preg_match('`^https://`i', $url)) { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); } curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_COOKIESESSION, true); // Fichier dans lequel cURL va lire les cookies curl_setopt($ch, CURLOPT_COOKIEFILE, $cookies_file); $page_content = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); /************************************************** Troisème requête : Déconnexion **************************************************/ $url = 'http://www.alsacreations.com/ident/logout/'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); if (preg_match('`^https://`i', $url)) { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); } curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_NOBODY, true); curl_setopt($ch, CURLOPT_COOKIESESSION, true); curl_exec($ch); curl_close($ch); // Effacement du fichier de stockage des cookies if (file_exists($cookies_file)) unlink($cookies_file); /**************************************** Affichage ****************************************/ if ($http_code == 200) { if (preg_match('`Vous avez (d+) nouveaux messages`i', $page_content, $matches)) echo $matches[1]. ' nouveau(x) message(s)'; else echo 'Aucun message'; } else { echo 'Une erreur est survenue : '. $http_code; } ?>