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;
}
?>


