Requetes HTTP et cookie de session
Bonjour,
Voici la communication échangée entre mon client et mon serveur. L'objectif étant de s'authentifier, puis d'envoyer à un service l'adresse email de mon utilisateur à créer.
Le serveur est sous symfony, et côté client, je forge moi-même mes requêtes. Voir la partie du script php qui construit les requêtes au bas de ce message.
Mon problème est que je perds la session ... où en tout cas mon serveur ne la retrouve pas. Est-ce qu'il y a un problème dans mes entêtes (surtout celles concernant le cookie ) ?
======================================================================
====== Echange des requêtes brutes HTTP entre client et serveur ======
======================================================================
Etape 1: Login
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
- Site-client envoi:
POST /api_dev.php/login HTTP/1.1
Host: server.localhost
Referer: http://client.localhost/frontend_dev.php/souscrire
Content-type: application/x-www-form-urlencoded
Content-length: 34
Connection: close
username=formation&password=blabla
- Serveur répond :
HTTP/1.1 202 Accepted
Date: Mon, 20 Dec 2010 16:04:37 GMT
Server: Apache/2.2.11 (Win32) PHP/5.2.6
X-Powered-By: PHP/5.2.6
Set-Cookie: symfony=fmn9br8i4rkfkrdnjlhea6p4k7; path=/
Content-Length: 0
Connection: close
Content-Type: text/html; charset=utf-8 |
Commentaire : Ici l'authentification se passe bien, je récupère même le cookie qui correspond a l'enregistrement du username en session côté serveur
Etape 2: Demande d'un fichier
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
- Site-client envoi:
GET /api_dev.php/formation/diffusion-list.xml HTTP/1.1
Host: server.localhost
Referer: http://client.localhost/frontend_dev.php/souscrire
Cookie: symfony=fmn9br8i4rkfkrdnjlhea6p4k7
Content-length: 0
Connection: close
- Serveur répond :
HTTP/1.1 200 OK
Date: Mon, 20 Dec 2010 16:04:37 GMT
Server: Apache/2.2.11 (Win32) PHP/5.2.6
X-Powered-By: PHP/5.2.6
Content-Length: 155
Connection: close
Content-Type: text/xml; charset=utf-8
<?xml version="1.0" encoding="utf-8"?>
<diffusionLists>
<diffusionList>
<id>2</id>
<name>news_hebdo</name>
</diffusionList>
</diffusionLists> |
Commentaire : Ici je récupère une fichier xml, mais il ne requiert pas d'authentification, donc aucun problème
Etape 3: Demande d'inscription d'un utilisateur (en utilisant optionnellement le résultat du XML précédemment fourni, mais ca n'est pas important)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
- Site-client envoi:
POST /api_dev.php/contact/subscribe HTTP/1.1
Host: server.localhost
Referer: http://client.localhost/frontend_dev.php/souscrire
Cookie: symfony=fmn9br8i4rkfkrdnjlhea6p4k7
Content-type: application/x-www-form-urlencoded
Content-length: 25
Connection: close
contact%5Bemail%5D=bigltnt@monemail.com
- Serveur répond :
HTTP/1.1 401 Unauthorized
Date: Mon, 20 Dec 2010 16:04:51 GMT
Server: Apache/2.2.11 (Win32) PHP/5.2.6
X-Powered-By: PHP/5.2.6
Content-Length: 0
Connection: close
Content-Type: text/html; charset=utf-8 |
Commentaire : Les problèmes commencent ici; je renvois du côté de mon serveur une erreur 401 pour dire que la ressources nécessite une authentification, et que le client n'est pas connecté (malgré l'étape 1 snif :cry: ). D'ailleurs, en regardant $_SESSION il n'y a effectivement rien ...
Etape 4: Afin de gérer la perte de session dûe a une expiration, je refais l'etape de login automatiquement, remix de l'étape 1 donc ...
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
- Site-client envoi:
POST /api_dev.php/login HTTP/1.1
Host: server.localhost
Referer: http://client.localhost/frontend_dev.php/souscrire
Cookie: symfony=fmn9br8i4rkfkrdnjlhea6p4k7
Content-type: application/x-www-form-urlencoded
Content-length: 34
Connection: close
username=formation&password=blabla
- Serveur répond :
HTTP/1.1 202 Accepted
Date: Mon, 20 Dec 2010 16:04:51 GMT
Server: Apache/2.2.11 (Win32) PHP/5.2.6
X-Powered-By: PHP/5.2.6
Content-Length: 0
Connection: close
Content-Type: text/html; charset=utf-8 |
Commentaire : Et ce ***** de serveur me dit que tout vas bien, d'ailleurs si je regarde $_SESSION il enregistre effectivement ma variable username
Question : Est-ce normal que je ne recoive pas de directive "Set-Cookie:" ?
Etape 5 : Une fois reconnecté, je retente la requête d'inscription de mon utilisateur
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
- Site-client envoi:
POST /api_dev.php/contact/subscribe HTTP/1.1
Host: server.localhost
Referer: http://client.localhost/frontend_dev.php/souscrire
Cookie: symfony=fmn9br8i4rkfkrdnjlhea6p4k7
Content-type: application/x-www-form-urlencoded
Content-length: 25
Connection: close
contact%5Bemail%5D=bigltnt@monemail.com
- Serveur répond :
HTTP/1.1 401 Unauthorized
Date: Mon, 20 Dec 2010 16:04:51 GMT
Server: Apache/2.2.11 (Win32) PHP/5.2.6
X-Powered-By: PHP/5.2.6
Content-Length: 0
Connection: close
Content-Type: text/html; charset=utf-8 |
Commentaire : Ben oui ... ça ne marchait pas la première fois il n'y a pas de mystère .... ca marche toujours pas ! :aie:
======================================================================
========== Partie du script qui construit mes requêtes HTTP ==========
======================================================================
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
<?php
// [...] Des trucs avant
$fp = fsockopen($host, 80);
$request = '';
// send the request headers:
$request .= ( $request_type == self::REQUEST_POST ? 'POST' : 'GET' ) . " $path HTTP/1.1\r\n";
$request .= "Host: " . $host . "\r\n";
$request .= "Referer: " . $this->_referer . "\r\n";
// Gestion du cookie
if ( $cookie = $this->_getCookie() )
{
//exit( $cookie );
$request .= "Cookie: " . $cookie . "\r\n";
}
// Content type si POST request
if ( $request_type == self::REQUEST_POST )
$request .= "Content-type: application/x-www-form-urlencoded\r\n";
$request .= "Content-length: ". strlen($data) ."\r\n";
$request .= "Connection: close\r\n\r\n";
$request .= $data;
fputs($fp, $request);
$result = '';
while(!feof($fp)) {
// receive the results of the request
$result .= fgets($fp, 128);
}
// close the socket connection:
fclose($fp);
// [...] Des trucs après
?> |