Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Ta sama sesja na roznych domenach, Dla ambitnych :)
Seth
post
Post #1





Grupa: Przyjaciele php.pl
Postów: 2 335
Pomógł: 6
Dołączył: 7.03.2002

Ostrzeżenie: (0%)
-----


Mam taki ciekawy problem do rozgryzienia ktorym chcialem sie z Wami podzielic.

Calosc rozchodzi sie o uwierzytelnianie uzytkownika na roznych domenach.
Zalozmy, ze mamy serwis na domenie example.com
Na nim dokonuje sie autoryzacja uzytkownika.
Uzytkownik po kliknieciu na link, kierujacy go do innej domeny (example.pl) ma byc juz zalogowany z tymi samym loginem i uprawnieniami co na bazowej domenie.

Oczywiscie nie da sie ustawic ciasteczka sesyjnego dla kilku domen, wiec ten spsob odpada.

Serwisy nie posiadaja zcenralizowanego mechanizmu przechowywania sesji, a wiec nie mozna tez od tak przekazac ID sesji np po przez URL.



Resaumujac wyglada to tak: loguje sie na serwisie excample.com, przechodze na serwis example.pl i jestem zalogowany z tym samym loginem co na example.com.


Moim pomyslem na rozwaizanie tego problemu jest nastepujacy:

Serwis example.com, w momencie gdy uzytkownik sie zaloguje, serwuje mu strone - strona ta zawiera odwolanie do skryptu PHP generujacego przezroczysty obrazek 1x1 px.
Serwis ten przekazuje w parametrze np. <img src="http://example.pl/activate.php?sesid=123" ... /> zmienna sesid.
Okresla ona ID sesji na serwerze example.com
W momencie kiedy zostaje wywolany skrypt active.php (ktory jest tak naprawde obrazkiem) pobierana jest zmienna sesid.
Nastepnie skrypt uruchamia sesje (session_start()).
Pozniej sprawdza czy istnieje zmienna np. $_SESSION['auth'] ktora ma wartosc true - po to aby sprawdzic czy przypadkiem juz wczesniej nie zostala aktywowana sesja (czy wczesniej nie bylo wywolania tego skryptu).
Jezeli nie ma takiej zmiennej, skrypt odsyla wartosc zmiennej sesid do serwera example.com w celu zweryfikowania czy sesja jest autentyczna.
Tutaj mozna uzyc albo WebServices albo po prostu wywolac adres http://example.com/is_valid?sesid=<i tutaj wartosc zmiennej sessid przekazana do skryptu activate.php> - w odpowiedzi dostali bysmy np '1'
Jezeli jest ustawia zmienna $_SESSION['auth'] na true.

Dzieki temu sesja moze byc niejako przekazywana miedzy domenami.


Co o tym sadzicie, jakie sa Wasze pomysly?


P.S.
Jezeli cos jest neizrozumiale prosze pytac (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Ten post edytował Seth 25.11.2007, 23:59:26
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
spamcop
post
Post #2





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 8.01.2008

Ostrzeżenie: (0%)
-----


Ja mam inna dzialajaca :] koncepcje. Potrzebna jest jednak baza np MySQl do ktorej maja dostep wszystkie serwery,
pomiedzy ktorymi chcemy przekazywac sesje. 
Tutaj opisze ogolna koncepcje wersji najprostszej.
Zakladamy tabele w mysqlu np jak ponizej.
Bedziemy przekazywac tylko username, ale mozna oczywiscie dowolne
zmienne sesji w formie zakodowanej session_encode lub jawnej

CREATE TABLE `session_transfer` (
`id` int(10) unsigned NOT NULL auto_increment,
`pid` varchar(64) NOT NULL,
`username` varchar(64) NOT NULL,
`expiration` varchar(16) NOT NULL,
`target_host` varchar(254) NOT NULL,
PRIMARY KEY (`id`)
)

pid - losowy id sesji
username - przekazywany parametr
expiracja - czas do ktorego nalezy wykorzystac pida
host_fw - nazwa hosta docelowego

Na kazdym serwerze funkcjonuja 2 includy:
session_send.php ktory wysyla usera na innego hosta
session_receive.php ktory przyjmuje usera z innego hosta

W momencie przerzucania sesji (klikniecie w button), session_send.php tworzy pida
i wpisuje pida i reszte danych do bazy ustalajac czas expiracji np na 2-3s,
wpisuje tez hosta docelowego i na potrzeby usera tworzy URL z pidem
i domeną przyporzadkowana do hosta docelowego. Przekierowuje za pomoca header()
User klikajac na buttonie przenosi pida na hosta docelowego

Na hoscie docelowym session_receive.php przyjmuje pida i czyta z bazy
wszystkie potrzebne dane odpalajac sesje, sprawdza przy tym czy czas transferu
nie zostal przekroczony (expiracja) oraz czy host docelowy jest ten sam jaki jest
w target_host. Jesli wszystko jest ok podstawia na nowym hoscie odpowiednie
dane do sesji i mozna sie bawic jako zalogowany user na zupelnie innej domenie.
jesli pid sie nie zgadza, albo np wyekspirowal mozna ustawic powrot
na hosta macierzystego.

Mechanizm ogolnie prosty jak budowa cepa. Pisanie do tego jakis skomplikowanych klas to IMO przerost formy nad trescia. wystarcza dwa includy po parenascie linii kodu z zapytaniami do bazy INSERT i SELECT

Jesli cos niejasne prosze pytac. Milej zabawy.

--
(spamcop[at]interia.pl)
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 6.10.2025 - 09:53