J'ai un problème bizarre avec les cookies dans IE. Lorsqu'un utilisateur se connecte au site, je génère un nouvel identifiant de session et je dois donc écraser le cookie. Le processus est le suivant :
-
Le client se rend à
https://secure.example.com/users/login
en recevant automatiquement un identifiant de session -
Le client envoie ses identifiants de connexion à la même adresse.
-
Le client reçoit les en-têtes set-cookie suivants ainsi qu'une redirection 302 vers
https://secure.example.com/users/mypage
:CAKEPHP=deleted ; expires=Sun, 05-Apr-2009 04:50:35 GMT ; path=/
CAKEPHP=98hnIO23... ; expires=Mon, 12 Apr 2010 04:50:36 GMT ; path=/ ; secure -
Le client est censé visiter
https://secure.example.com/users/mypage
en présentant le nouvel identifiant de session.
Cela fonctionne dans tous les navigateurs, sauf IE (testé dans 7 et 8). IE conserve l'ancien identifiant de session non authentifié et est redirigé vers la page de connexion. Cela fonctionne dans mon environnement de test local (en utilisant un certificat auto-signé à l'adresse suivante https://localhost:8443/...
), mais pas sur le serveur en direct.
J'utilise CakePHP et émet simplement un $this->Session->renew()
qui produit les en-têtes de cookie ci-dessus.
Avez-vous des idées pour faire en sorte qu'IE accepte le nouveau cookie ?
Voici l'en-tête complet :
HTTP/1.0 302 Moved Temporarily
Date: Thu, 08 Apr 2010 02:54:30 GMT
Server: Apache
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
Set-Cookie: CAKEPHP=deleted; expires=Wed, 08-Apr-2009 02:54:30 GMT; path=/
Set-Cookie: CAKEPHP=d55c...; expires=Thu, 15 Apr 2010 02:54:31 GMT; path=/; secure
Last-Modified: Thu, 08 Apr 2010 02:54:30 GMT
Location: https://secure.example.com/users/mypage
Vary: Accept-Encoding
Content-Length: 0
Connection: close
Content-Type: text/html; charset=utf-8
Je pense avoir trouvé le problème : IE envoie deux des cookies de nom identique. Voici la prochaine requête au serveur :
GET /users/mypage HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, */ *
Referer: https://secure.example.com/users/login
Accept-Language: en-gb
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322)
Accept-Encoding: gzip, deflate
Host: secure.example.com
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: CAKEPHP=19c6...; CAKEPHP=d55c...
Remarquez qu'il envoie deux cookies, celui qu'il a reçu après s'être connecté, mais aussi l'ancien. Il a reçu l'ancien cookie sur la page principale example.com
set avec path=/
. Il l'envoie aussi pour des demandes de secure.example.com
. Il n'est pas remplacé par l'en-tête ci-dessus, mais il est ajouté comme cookie supplémentaire. Comment puis-je l'empêcher de faire cela ?