- 1
[Opened] [résolu] Partage de sessions entre plusieurs sites avec jSession en base de données
Posted by lucky on 10/01/2011 16:12
Bonjour,
J'ai un problème pour conserver les infos de sessions en naviguant d'un site A vers un site B, les deux étant bien entendu à base de jelix ;) J'utilise l'objet jSession avec stockage en base de données (via dao "jelix~jsession"). Je suis en Jelix 1.3 RC2, les sites A et B sont hébergés chez 1and1, et ont accès aux mêmes bases de données MySQL.
Je veux par exemple que, si je m'authentifie sur le site A (via jAuth), je sois automatiquement "connecté" (sans avoir à m'authentifier à nouveau) quand je passe sur le site B.
En fait, ça fonctionne très bien si je navigue avec IE 9, mais pas avec Firefox (version 7.0.1) :(
Qu'est-ce qui pourrait expliquer une telle différence de comportement ?
[Opened] Partage de sessions entre plusieurs sites avec jSession en base de données
Posted by laurentj on 10/01/2011 17:06
Bonjour,
c'est à priori un problème de cookie. Les deux sites en question ont des noms de domaine différents ?
[Opened] Partage de sessions entre plusieurs sites avec jSession en base de données
Posted by lucky on 10/01/2011 17:13
Les sites en question sont sur le même domaine widest-mine.org :
[Opened] Partage de sessions entre plusieurs sites avec jSession en base de données
Posted by laurentj on 10/02/2011 09:13
Un cookie n'est valable que pour un domaine spécifique, et par défaut, c'est le domaine courant. En toute logique donc, le cookie de session qui est crée quand tu es sur l'appli A, n'est pas valable pour l'appli B. Le comportement de IE est donc pour le moins bizarre, par contre celui de firefox est le bon.
Si tu veux que ta session soient reconnu sur les deux sites, il faut qu'il y ait un cookie de session avec le même identifiant pour chaque site, lors de la création de la session, ou alors que le cookie de session créé soit valable pour les deux domaines.
dans le application.init.php des 2 applis, utilise session_set_cookie_params pour indiquer le domaine ".widest-mine.org", ainsi tout les sous-domaines auront la même session. Ne fait pas ça par contre si tu as d'autres sous domaines où il ne faut pas la même session.
L'autre solution, c'est de hacker jSession, pour qu'après le session_start(), un set_cookie soit fait sur l'autre domaine, avec les mêmes paramètres et valeurs.
[Opened] Partage de sessions entre plusieurs sites avec jSession en base de données
Posted by lucky on 10/02/2011 15:58
dans le application.init.php des 2 applis, utilise session_set_cookie_params pour indiquer le domaine ".widest-mine.org", ainsi tout les sous-domaines auront la même session. Ne fait pas ça par contre si tu as d'autres sous domaines où il ne faut pas la même session.
Voilà donc le code que j'ai ajouté en fin de fichier application.init.php pour chaque appli sous-domaine :
$currentCookieParams = session_get_cookie_params(); $rootDomain = '.widest-mine.org'; session_set_cookie_params( $currentCookieParams[["lifetime"]], <code> $currentCookieParams["path"], $rootDomain, $currentCookieParams["secure"], $currentCookieParams["httponly"] );</code>
Malheureusement, cela reste sans effet !
Laurent, aurais-je mal compris ce que tu expliquais, ou mal mis en pratique ?..
EDIT: cela m'embête d'autant plus que tout fonctionne comme je l'attends avec IE9, ainsi qu'avec Opera 11 (?)
[Opened] Partage de sessions entre plusieurs sites avec jSession en base de données
Posted by laurentj on 10/02/2011 19:08
je dirais que c'est bon. à toi de voir après ce que tu as dans le cookie dans ton navigateur, voir si tu as bien le domaine indiqué etc. Tu as effacé les anciens avant de recommencer ?
Pour moi le comportement de IE9 et Opera 11, sans le set_cookie_params, sont fautifs, trop laxistes en terme de sécurité, voir irrespectueux de la specification. Un cookie ne doit être lisible que pour le domaine pour lequel il a été crée, et pas d'autres domaines ou sous domaines voisins. C'est dans les specs des cookies.
bref, avec ".widest-mine.org", il sera visible pour fr.widest-mine.org et autre sous domaine.
vérifie bien que tu as tout nettoyer dans ton navigateur (cache, cookie etc) pour le domaine et sous domaine ciblé, avant chaque tentative.
[Opened] Partage de sessions entre plusieurs sites avec jSession en base de données
Posted by laurentj on 10/02/2011 19:18
d'ailleurs je viens de tester ton site avec firefox : chez moi, ça fonctionne très bien, quand je m'authentifie sur l'un, je reste bien authentifié sur l'autre. Et je n'ai bien qu'un seul cookie pour les deux.
Par contre tu as d'autres soucis : quand je m'inscris sur l'un, je ne peux pas me connecter sur l'autre. Tu ne sembles pas partager la même table des users, c'est dommage ;-)
Et quand je suis connecté sur en, je ne vois pas les forums sur fr. ça par contre je ne sais pas ce que c'est. Un problème de droits probablement...
donc quand on s'inscrit, il faut aller enregistrer dans la table des users et des droits de l'autre base. Et pour cela, créer un listener sur les évenements de jauth (à l'enregistrement et à la suppression), qui fera ces enregistrements.
[Opened] Partage de sessions entre plusieurs sites avec jSession en base de données
Posted by lucky on 10/02/2011 22:05
C'est bon. Effectivement, après suppression des cookies pré-existants, ça fonctionne comme je le voulais. Merci pour ton aide ;)
Initialement, les forums français, anglais et espagnol étaient présents ensemble sous le domaine principal. Je viens de procéder à une réorganisation dans le but de pouvoir mieux cibler l'audience en fonction de la langue, d'où les nouveaux sous-domaines, qui sont "isolés" les uns des autres (ainsi les stats figurant en bas de pages sont propres à chaque sous-domaine, sans aucun mélange entre langues). Pour arriver à ce résultat, j'ai été obligé d'éclater la base de départ en trois bases distinctes, une par langue donc.
Effectivement, il reste encore des choses à améliorer, et dans cette optique toute remarque est la bienvenue !
[Opened] Partage de sessions entre plusieurs sites avec jSession en base de données
Posted by lucky on 10/04/2011 23:58
Par contre tu as d'autres soucis : quand je m'inscris sur l'un, je ne peux pas me connecter sur l'autre. Tu ne sembles pas partager la même table des users, c'est dommage ;-)
Laurent a bien raison. Si le sujet du partage de session est résolu, il reste donc matière à discuter sur la problématique de l'authentification que j'expose dans un post sur le forum HaveFnubb : je suis toujours à la recherche d'une solution (pour ceux que cela intéresse ;))...
- 1