Cookies HTTP et requêtes Ajax via HTTPS

Je sais que cela a déjà été demandé sous diverses formes, mais je n’arrive pas à contourner le problème. J’ai essayé d’utiliser jQuery et l’API JS native pour effectuer les requêtes Ajax.

Ma situation est la suivante (voir schéma ci-joint):

  1. Le navigateur fait la requête HTTP
  2. Le serveur répond et définit un cookie persistant
  3. Le navigateur effectue une requête HTTP Ajax, Cookie est là
  4. Le serveur répond comme prévu, met à jour le cookie
  5. Le navigateur effectue une requête HTTPS Ajax, le cookie n’existe plus (?!)
  6. Le serveur donne une réponse “par défaut”, car il n’y a pas de cookie (comportement inattendu)

Avant de commencer une conférence sur les requêtes inter-domaines, permettez-moi d’énoncer quelques points:

  • Je sais qu’il s’agit d’une requête interdomaine (protocole différent) et c’est pourquoi le serveur définit l’en Access-Control-Allow-Origin tête Access-Control-Allow-Origin dans la réponse (et j’utilise Chrome et Firefox, tous deux prenant en charge CORS ).
  • Ce que je sais aussi, cependant, c’est que le cookie HTTP devrait être gérable sur HTTPS (voir ici ) puisque l’hôte est le même
  • (EDIT) Le cookie est correctement défini pour le domaine général (par exemple .domain.ext) et ni les indicateurs HttpOnly ni les indicateurs Secure ne sont définis.

Alors, pourquoi, pourquoi le navigateur ne transmet-il pas le cookie lors de l’appel HTTPS Ajax? Des idées? Je suis sur le sharepoint perdre la tête …

  +-----------+ HTTP Request +-----------+ |Browser |+---------------->|Server | +-----------+ +-----------+ HTTP Response  Cookie (OK) HTTP Response  No Cookie (!!!) 

Ok, a trouvé la solution au problème des cookies.

Voir les spécifications XHR , les documents jQuery et StackOverflow .

La solution pour que les cookies soient envoyés lors du changement de protocole et / ou de sous-domaine consiste à définir la propriété withCredentials sur true .

Par exemple (en utilisant jQuery)

  $.ajax( { /* Setup the call */ xhrFields: { withCredentials: true } }); 

Document.cookie et Ajax Request ne partagent pas le cookie. Sinon, ajax ne peut pas accéder aux cookies de document.cookie ou des en-têtes de réponse. Ils ne peuvent être contrôlés que par le domaine distant.

Si vous obtenez d’abord une réponse incluant un cookie du serveur par ajax, vous pouvez demander une communication ajax avec un cookie au serveur.

Pour ce cas, vous écrivez comme ci-dessous le code (jQuery)

  $.jajx({ xhrFields : { withCredentials : true } }); 

Voir cet article et démo