![]() |
![]() |
![]() ![]()
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 |
|
|
![]() |
![]()
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) |
|
|
![]() ![]() |
![]() |
Aktualny czas: 6.10.2025 - 09:53 |