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 :

  1. Se connecter à son compte sur le site puis stocker les cookies de session,
  2. Requêter la page désirée en passant les cookies de session,
  3. 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;

}

?>

 

A propos de l'auteur

Antoine Beaumont

Antoine Beaumont est Consultant Web et Développeur. Fort d'une expérience construite au sein de grandes agences Web-marketing, pour tous types de comptes, il accompagne désormais les professionnels dans leurs projets Web, de façon souple et objective.