Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przenoszenie sesji między serwisami
Forum PHP.pl > Forum > PHP
wojto
Witam,
Tworze serwis, ktory ma sie skladac z kilku podserwisow, np. profil.xxx.pl (glowna strona serwisu), gry.xxx.pl, mp3.xxx.pl itp. Kazdy z tych podserwisow bedzie umieszczony na innym serwerze, ale maja miec wspolna baze danych z profilami uzytkownikow.
Korzystanie ze wspolnej bazy danych z profilami mam juz zrobione, ale problem jest podczas logowania, bo podczas przechodzenia pomiedzy serwisami na kazdym z nich tworzona jest nowa sesja, a ja chce, aby ciagle byla ta sama sesja.

Narazie rozwiazalem to w ten sposob, ze identyfikator sesji przekazuje w linku, czyli np. bedac w serwisie gry.xxx.pl klikajac w link profil.xxx.pl/sesja=34rh43uirh34ruih34rui43rhr34r wchodze na serwis profilu i tam sobie skryptem pobieram i tworze sesje o identyfikatorze z tego linka.
Problem pojawia sie, gdy np. zaloguje sie w profil.xxx.pl i nie przejde do podstrony po linku gry.xxx.pl?sesja=3urhi34uhr3i4urh3i4rhu tylko wpisze bezposrednio gry.xxx.pl, wtedy tworzy losowa sesje.

Probowalem korzystac z session.cookie_domain, ale ono moze korzystac z jednoelementowych adresow z .com, np. xxx.com, musialo by byc cos.xxx.com.

Czy jest jakis inny sposob, aby logujac sie na jednym serwisie byc jednoczesnie zalogowanym na innym? Oba serwisy oczywiscie na innych serwerach :/

Dzieki za ewentualne odpowiedzi.
nrm
1. sesid w urlu to kiepski pomysł.

2. a wlasny session-handler nie daje rady? baza z sesjami musiala by tylko stac na jednym z serwerów. napisalem cos takiego i tez ma działać na kilkunastu podserwisach portalu. wprawdzie jeszcze nie testowałem w sieci ale niesądziłem, że może byc z tym jakiś problem.
bregovic
Ok, jeżeli tylko wszystkie strony znajdują się na jednej domenie to da się to zrobić. Jeśli używasz własnego session handlera, to używasz zapewne metody setcookie" title="Zobacz w manualu php" target="_manual().

Cytując:
Cytat(http://php.net/manual/en/function.setcookie.php)
To make the cookie available on all subdomains of example.com then you'd set it to '.example.com'. The . is not required but makes it compatible with more browsers. Setting it to www.example.com  will make the cookie only available in the www  subdomain. Refer to tail matching in the spec for details.


Czyli w twoim przypadku:
  1. <?php
  2. setcookie('name', 'value', expire, '/', '.xxx.pl');
  3. ?>


Natomiast jeśli strony znajdują się na różnych domenach, to jesteś ugotowany (nie wydaje mi sie żeby można było coś wtedy zrobić).
wojto
@normanos: zgadza sie, baza z uzytkownikami stoi tylko na jednym serwerze i wszystkie inne erwisy z niej korzystaja
wlasna obsluga sesji oczywiscie jest, ale co z tego, skoro identyfikator tej sesji jest gubiony przy przejsciach miedzy serwisami

@bregovic: no wlasnie jest problem, bo strony znajduja sie na roznych domenach :/
bregovic
Wydaje mi się to niemożliwe bez przekazywania identyfikatora po linkach - a to głupi pomysł (sniff).
nrm
cholera. przyznam, że zainteresował mnie problem. mam cos podobnego, wlasny session handler oparty na bazie. cookies bezposrednio nie uzywam (funkcje php sie tym zajmuja). sprawdzilem i rzeczywiscie tworza mi sie osobne sesje na domena.pl i subdomena.domena.pl

cow takim wypadku zrobic?
dalem
ini_set('session.cookie_domain', '.domena.pl');
ale nic to nie dało.

edit: sprawdzałem na innym serwerze. wprawdzie tam nie mam subdomen ale sprawdzałem wysyłane nagłówki i tam nagle pojawia się

PHPSESSID=3d5207c3d2862136b74df97ea428ebe3; path=/; domain=.domena.pl

w przeciwienstwie do mojego serwera gdzie najwyrażniej ini_set jest ignorowany.
mozna coś jeszcze z tym robic czy juz mam szukac nowego serwera? sad.gif(
NuLL
IMHO jedyne sluszne rozwiazanie to jakies niceUrl's oraz dodawanie na koncu adresu identyfikatora sesji.
dr_bonzo
Cytat
w przeciwienstwie do mojego serwera gdzie najwyrażniej ini_set jest ignorowany.
mozna coś jeszcze z tym robic czy juz mam szukac nowego serwera? sad.gif(

void session_set_cookie_params ( int lifetime [, string path [, string domain [, bool secure]]] )
?
wojto
@normanos: jezeli ta funkcja, ktora podal dr_bonzo nie zadziala, to znaczy, ze nie mozesz pewnie zmieniac ustawien domeny ciastek.

Ja wczesniej wpadlem na jeszcze inny sposob:
Z baza danych laczysz sie bezproblemowo z obu serwisow. W takim razie wchodzac na subdomena.domena.pl zapisujesz do bazy nowa sesje i dodatkowo hash informacji o tobie (ip, przegladarka itp.), np.
  1. <?php
  2. $_SERVER['REMOTE_ADDR'].sha1(gethostbyaddr($_SERVER['REMOTE_ADDR']).
  3. (isset($_SERVER['HTTP_X_FORWARDED_FOR'])?$_SERVER['HTTP_X_FORWARDED_FOR']:'').
  4. $_SERVER['HTTP_USER_AGENT'])
  5. ?>

nastepnie wchodzac na domena.pl za pierwszym razem zapewne sprawdzasz, czy sesja istnieje, jesli nie, to tworzysz losowy identyfikator, tutaj wystarczy dac kolejnego if'a jesli sesja nie istnieje, to sprawdzasz w bazie, czy istnieje sesja i takim hashu jak teraz masz, jesli tak, to pobierasz jej identyfikator i tworzysz nowa sesje o pobranym ID.

U mnie by to dzialalo, tylko problem byl z tym, ze czasami pozostawaly jakies smiecie z poprzednich logowan tego usera, wsrod tych smieci byly tez stare sesje tego uzytkownika (ktore by zapewne zostaly usuniete po wykonaniu gc()). Wiec problem byl z wylogowaniem, bo znajdowal stara sesje.
nrm
1. tak, własnie wlazłem tu napisac, że udało mi się to rozwiązac przez session_set_cookie a widze, że i inni na to wpadli smile.gif chyba działa - chyba bo patrze po nagłówkach, chwilowo nie mam środowiska do testowania.

@wojto: ciekawe ale ja akurat korzystam z sesji wbudowanych w php tylko podmienilem je sobie na baze zamiast plików i dodałem kilka potrzebnych rzeczy (ip, user, useragent, lokalizacja). w tym wypadku nie zajmuje sie tworzeniem identyfikatorów sesji etc. bo tym nadal sie zajmuje php. ja tylko podmienilem funckje _read, _write, _open, _close, _gc etc.

cóż, grunt ze działa mi to w obrebie jednej domeny. wprawdzie calośc będzie w 2 kopiach na roznych domenach ale jako ze maja to byc niezalezne serwisy to nie jest to takie istotne.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.