[Ajax] Appel fichier externe et sessions

WRInaute passionné
Bonjour,

J'essaie de réaliser la configuration suivante :
- serveur A appelant script S de serveur B (via ajax.request)
- le script S démarre une session, stocke des cookies...etc
- le serveur A redirige ensuite sur le serveur B (window.location.replace)

Mon problème est que le serveur B ne récupère pas les sessions et cookies instanciés dans le script S.

J'ai bien autorisé script S à recevoir des données du serveur A :
Code:
header("Access-Control-Allow-Origin: http://mon-serveurA.com");
header("Access-Control-Allow-Headers: X-Prototype-Version,X-Requested-With");

En consultant l'outil de développement du navigateur, je constate que mon script S est appelé à deux reprises dont la première avec une methode OPTIONS que je ne comprends pas...

Bref si vous avez une solution merci.


PS : mon serveur B est un sous domaine de serveur A
 
WRInaute accro
il me semble (jamais testé) que tu peut passer un cookies entre sous domaines si il est défini sur le domaine principal "example.com" (et pas "www.example.com").
bref il serait alors exploitable via le www et tout autre sous domaine. Il est alors peut être possible de gérer des sessions communes.
 
WRInaute passionné
J'ai essayé, ce n'est vraisemblablement pas ça le problème.

Je viens de voir qu'aucun cookie n'est créé sur le script S hormis le PHPSESSID.

En fait, après tests, je constate :
- si création d'un cookie avant création session, session inexistante, valeur du cookie effacée, domaine modifié (par celui enregistré dans la session)
- si session créée avant enregistrement cookie, le cookie n'est pas sauvegardé mais modifie la session (domaine)

Bref, la galère... un seul cookie sauvegardable, session comprise (sans pour autant réussir à la récupérer ensuite)
 
WRInaute discret
Dans ton htaccess
php_value session.cookie_domain .example.com

Dans ton code php
ini_set('session.cookie_domain', '.example.com' );

Ensuite, il faut déclarer le session id dans ton cookie de cette manière :
Code:
setcookie("PHPSESSID", session_id(), $dateDePeremption, "/", ".example.com");

J'ai mis ceci en place pour un service de téléchargement de fichier avec stockage de fichiers sur plusieurs serveurs différents en utilisant les sous domaines du genre serv1.dom.fr
 
WRInaute passionné
Merci mais ça ne fonctionne toujours pas même si je sens que l'on se rapproche.

Mon serveur B me rebalance à chaque fois le même session_id(). J'ai beau tester toutes les solutions pour supprimer cette session vide, impossible, il faut une fermeture du navigateur pour qu'elle soit réinitialisée, et malheureusement, elle est réinitialisée à la place d'utiliser la session en cours...
 
WRInaute discret
Je sais pas trop comment t'aider sans connaitre beaucoup plus d'informations technique sur les machines etc ...

Sinon, si tu as une base de donnée centrale au domaine et sous domaine, tu peut gérer un système de "token".

Tu ajoute un token dans la bdd depuis le site A.
Le site A appel le site B en passant le token
Le site B vérifie le token et récupère dans la bdd les infos requis

De cette façon, plus besoin d'être connecté vu que le token est ajouté depuis le site A.
Il faut évidemment supprime le token à l'utilisation de celle-ci.

Juste une idée :)
 
WRInaute passionné
J'aimerai ne rien passer ainsi.

J'ai essayé de renommer la session avec un ini_set('session_name', 'PHPSESSIDTEST');
Mais cela ne fonctionne pas alors qu'un session_name(PHPSESSIDTEST''); fonctionne.
Cependant ça ne change rien, il ne récupère pas la session et en crée une nouvelle...
En essayant de modifier directement le php.ini pour le domaine, le problème ne change pas donc cela ne viendrai pas du nom de domaine, ni du path, et là je suis un peu perdu :(
 
WRInaute accro
Tu as analysé les entêtes HTTP du request AJAX via firebug ou le débuggeur de ton nav préféré ?
Tu px voir si le set cookie s'est fait, si le type des données renvoyées sont bonnes, si t'as un headers already sent by, et j'en passe...
 
WRInaute passionné
Après analyse, le cookie de session n'est pas sauvegardé par le navigateur au niveau du script S.
Je pense que tous les navigateurs ne sont pas logés à la même enseigne mais la flemme de tous les tester...

Je vais me résigner à transmettre l'id session (peut-être à une page temporaire pour éviter que l'utilisateur se prenne cet id dans l'url).
 
WRInaute accro
Et sans AJAX t'as essayé de te rendre sur le site A et B et constater si la session est transmise ?
 
WRInaute passionné
Oui il n'y a pas de problème si la session est créée sur A pour la récupérer sur B.

Mais je ne veux pas ça car il est possible qu'il y ai plusieurs sessions différentes sur différents serveurs.

Je veux que A appelle un script de connexion de serveur B, C ou D et que A redirige sur celui-ci.
Le problème est que ce script n'enregistre pas du tout le cookie, peu importe le domaine qu'on lui fourni. Il n'y a que lorsque c'est un script du serveur A que cela fonctionne.
Malgré le fait de jouer avec Access-Control-Allow-Credentials qui en théorie autorise les cookies et sessions dans les url distantes, ça ne fonctionne pas :(
 
WRInaute accro
Robinson a dit:
J'essaie de réaliser la configuration suivante :
- serveur A appelant script S de serveur B (via ajax.request)
- le script S démarre une session, stocke des cookies...etc
C'est là que tu bug. C'est forcement le serveur A qui impose la session pas l'inverse puisque c'est lui qui est sollicité en premier.
Il est plus logique de récupérer la session sur le serveur B puisqu'elle existe déjà au moment ou ajax sollicite ce serveur.
 
WRInaute passionné
Non non le serveur A n'a aucune session de lancée avant de lancer le script.
C'est un simple formulaire qui transmet des données au script du serveur B et qui gère les retours du script (affichage des erreurs ou redirection vers le serveur B si connexion réussie).

En essayant sur Firefox et Safari (j'utilise Chrome), problème identique.

Le cookie de session n'est pas sauvegardé, que cela soit pour le serveur A ou B.
 
WRInaute accro
et la config du navigateur c'est pas un peut bridé genre "uniquement pour le domaine" et pas les domaines tiers ? (mais bon ça changera rien a ton problème vue sue tu va pas faire bidouiller tes utilisateurs)
 
WRInaute discret
J'ai l'impression que ton soucis est pas que une histoire de code, mais je peut me tromper.

Tu pourrais donner un exemple basic mais complet sur ce que tu souhaite faire ?
De cette façon on pourra non seulement voir la logique du processus mais aussi tester nous même :)
 
WRInaute passionné
Je ne sais pas si je peux détailler davantage que je ne l'ai fait.
Je pense zapper ce problème vu que j'ai trouvé le moyen de passer outre mais bon il est possible qu'un jour je l'ai de nouveau.

Tous mes serveurs ne sont que virtuels, c'est la même machine, ce sont seulement des sous-domaines différents (mais il y aurait le même soucis sur un serveur vraiment distant).

Mon serveur/NDD principal me permet de me connecter sur le serveur/ss-domaine de mon choix.
J'envoie donc des données à un script du serveur en question pour m'y connecter. Si échec, affichage des erreurs, si réussite redirection sur ce serveur/ss-domaine.
Ce script en cas de réussite doit créer une session sur ce serveur, elle est bien créée mais le cookie de session n'est pas sauvegardé par le navigateur et donc impossible de la récupérer sans transmettre l'id de session.

J'ai lu à droite à gauche que cela était possible mais n'y arrive pas.


Je viens cependant je trouve de trouver la solution qui est utilisée un peu partout... elle se nomme CURL et gère très bien les sessions et cookies apparemment (ce que je ne savais pas ne l'ayant que survolée auparavant). Je ne sais pas pour autant si je vais l'utiliser dans le cas présent. Mais cela évitera à coup sûr les pertes de temps dans l'avenir.
 
Discussions similaires
Haut