2017-10-06 14 views
1

Je crois que je suis mise avec succès un cookie en utilisant cet extrait de code golang:

c = &http.Cookie{ 
     HttpOnly: false, 
     Name:  "_cas_cookie", 
     Value: newSessionID(), 
     MaxAge: 86400, 
    } 

    http.SetCookie(w, c) 

En fait, je peux voir l'aide du navigateur contrôler les outils. Il est également inclus dans les en-têtes de requête avec chaque clic de navigateur "normal". Cependant, il n'est inclus dans aucune requête ajax que j'envoie. J'ai utilisé fetch() et jQuery $ .ajax() avec le même résultat. De par sa conception, le code backend va générer un nouveau cookie avec le même nom s'il ne reçoit pas l'ancien. C'est ce qui se passe, et ce nouveau cookie est ensuite utilisé sur toutes les futures requêtes ajax. C'est presque comme si les cookies http et les cookies Javascript existaient dans des domaines séparés. Je pensais que définir le paramètre HttpOnly sur false prendrait soin de ce problème, mais ce n'est pas le cas.

Voici le code fetch().

function doGetFetch(url, callback){ 
    fetch(
     url, 
     {method: 'get', 
     credentials: 'same-origin' 
     }) 
    .then( 
     function(response) { 
      if (response.status !== 200) { 
       console.log('Problem Status Code: ' + 
       response.status); 
       return false; 
      } 
      // Examine the text in the response 
      response.json().then(callback); 
     }) 
    .catch(function(err) { 
     console.log('Fetch Error :-S', err); 
    }); 
} 

Une autre complication est que tout fonctionne bien en utilisant mon serveur de test localhost, mais échoue quand je déployer sur le serveur de production. La plus grande différence entre les deux est que localhost utilise le serveur Web interne de Golang (par exemple, http.ListenAndServer()), tandis que la production utilise CGI.

Merci pour tous les pointeurs sur de nouvelles choses à essayer!

+0

Cela peut être un problème de demande de domaine croisé. Peut-être que le Javascript sur le serveur CGI de production pense qu'il est sur un domaine différent, où il n'a pas un tel problème sur localhost. Cependant, je ne suis pas encore sûr. – Brent

Répondre

1

Un meilleur programmeur que moi a réduit le problème au chemin des cookies. Le code Go ci-dessus ne spécifiait pas le chemin, donc il serait réglé sur ce que Go fait par défaut. Par exemple, le chemin a varié de "/seminars.cgi" à "/seminars.cgi/seminar" et dans tous les cas, Javascript n'a pas pu voir le cookie. La solution consistait à spécifier le chemin explicitement à la racine:

c = &http.Cookie{ 
    HttpOnly: false, 
    Name:  "_cas_cookie", 
    Value: newSessionID(), 
    MaxAge: 86400, 
    Path:  "/", //Specify the path at the root 
} 

http.SetCookie(w, c) 

Cela fonctionne.