Jan Janiak

Jan Janiak Programista

Temat: Dwa serwisy - wspólne logowanie

Są dwa serwisy, portale internetowe: s1.pl, s2.pl. Obydwa mają własny mechanizm logowania i składowania sesji w własnych bazach danych. Chcę osiągnąć taki efekt, aby logując się do s1.pl można było przejść do s2.pl bez ponownego logowania się w s2.pl.

Szukałem, czytałem i wiem, że rozwiązanie wygląda tak: session_set_save_handler() - tworzę odpowiednie funkcje (lub metody w klasie) i wskazuję w funkcji session_set_save_handler(), która będzie obsługiwać read, open, write etc. Zakładam, że funkcję session_set_save_handler() uruchamiam w s2.pl.

Pytanie: metoda read(string $sessionId) otrzymuje identyfikator sesji, ale jest to identyfikator z s2.pl, zaś s1.pl ma inny identyfikator. Jak to ugryźć? Proszę o (p)odpowiedź.

konto usunięte

Temat: Dwa serwisy - wspólne logowanie

Wspólne logowanie to co innego niż wspólna sesja, ja nie znam sposobu na cross domain cookie, o ile istnieje na cross sub domain cookie, o tyle na ten pierwszy nie słyszałem.
Jan Janiak

Jan Janiak Programista

Temat: Dwa serwisy - wspólne logowanie

Przemek Czekaj:
Wspólne logowanie to co innego niż wspólna sesja, ja nie znam sposobu na cross domain cookie, o ile istnieje na cross sub domain cookie, o tyle na ten pierwszy nie słyszałem.
Zatem rozwiązanie powinno być inne? Jeśli tak, to jakie? Nie używać session_set_save_handler()?
Daniel Częstki

Daniel Częstki senior php developer

Temat: Dwa serwisy - wspólne logowanie

cross domain cookie ? gdyby była taka możliwość że z serwera a można ustawić sesję serwera b to byłoby na prawdę ciekawie ;)
Michał Jastrzębski

Michał Jastrzębski Django-fu, phpjutsu,
sql-do

Temat: Dwa serwisy - wspólne logowanie

Można zrobić takie coś: Masz jedną stronę logowania z domeną aaa.pl. Chcesz by logowanie przebiegło także na bbb.pl. Backend strony bbb.pl strzela w serwer sesyjny aaa.pl z identyfikatorem sesji (lub cookie z jakimśtam tokenem ze strony bbb.pl) i sprawdza czy ten token jest poprawny i jeśli jest, koleś jest zalogowany, jeśli nie jest to jest redirectowany na stronę logowania aaa.pl, i w przypadku poprawnego zalogowania 1. dodaje sie token do serwera sesji na aaa.pl, 2. klient jest redirectowany ze zmienną get do bbb.pl, która tą zmienną odczytuje i wsadza w ciacho na domenie bbb.pl.

konto usunięte

Temat: Dwa serwisy - wspólne logowanie

Ja to zrozumiałem że kolega chce uzyskać taki efekt że jak loguje się na s1.pl to jest automatycznie zalogowany na s2.pl po wejściu. Dobrze zrozumiałem?
Michał Jastrzębski

Michał Jastrzębski Django-fu, phpjutsu,
sql-do

Temat: Dwa serwisy - wspólne logowanie

No takie coś jest nieosiągalne...nie ma sposobu na identyfikacje użytkownika aaa na bbb...musi być jakakolwiek akcja ze strony użytkownika (np klik w "zaloguj")...ale można zrobić to niejawnie, np ajaxem...
Jan Janiak

Jan Janiak Programista

Temat: Dwa serwisy - wspólne logowanie

Michał Jastrzębski:
Można zrobić takie coś: Masz jedną stronę logowania z domeną aaa.pl. Chcesz by logowanie przebiegło także na bbb.pl. Backend strony bbb.pl strzela w serwer sesyjny aaa.pl z identyfikatorem sesji (lub cookie z jakimśtam tokenem ze strony bbb.pl) i sprawdza czy ten token jest poprawny i jeśli jest, koleś jest zalogowany, jeśli nie jest to jest redirectowany na stronę logowania aaa.pl, i w przypadku poprawnego zalogowania 1. dodaje sie token do serwera sesji na aaa.pl, 2. klient jest redirectowany ze zmienną get do bbb.pl, która tą zmienną odczytuje i wsadza w ciacho na domenie bbb.pl.
Myślę, że to jest to, ale nie do końca jeszcze rozumiem to co napisałeś :P Więc tak:
1. Formularz logowania jest pod adresem / subdomeną: s1.pl
2. Powyższy formularz obsługuje kod znajdujący się na s1.pl i tu następuje logowanie użytkownika oraz zapisanie sesji w bazie danych. Pytanie: co ponadto musi być wykonane na s1.pl?
3. Po wejściu pod adres / subdomenę s2.pl następuje odwołanie do s1.pl i sprawdzenie czy użytkownik jest już zalogowany czy nie. Pytanie: co przesłać GETem, co dodać do linku z adresem s2.pl, który kliknie zalogowany użytkownik na s1.pl, aby można było odpytać s1.pl czy jest on zalogowany? Identyfikator sesji z s1.pl?
Przemek Czekaj:
Ja to zrozumiałem że kolega chce uzyskać taki efekt że jak loguje się na s1.pl to jest automatycznie zalogowany na s2.pl po wejściu. Dobrze zrozumiałem?
W skrócie: tak.
Szerzej: na s2.pl wchodzi klikając link znajdujący się na s1.pl

Dodatkowo:
Obydwa serwisy mogą lub po prostu będą pracować na subdomenach, więc będzie:
s1.takafajnadomena.pl lub www.takafajnadomena.pl
s2.takafajnadomena.pl
Jan Janiak edytował(a) ten post dnia 13.07.12 o godzinie 12:02

konto usunięte

Temat: Dwa serwisy - wspólne logowanie

To chwila, jak to mają być subdomeny to wystarczy cookie, zobacz tu: http://blog.cylence.com/2008/11/30/cross-subdomain-coo... albo poszukaj po prostu w necie o cross sub domain cookie

konto usunięte

Temat: Dwa serwisy - wspólne logowanie

Moim zdaniem najbezpieczniej jest zaimplementować rozwiązanie podobne jakie stosuje Facebook lub Google.

Wyobraźmy sobie, że s1.pl i s2.pl umożliwiają zalogowanie się przy użyciu konta fb / google. Zauważ, że w przypadku gdy zrobiłeś to raz, to przy kolejnym wejściu aplikacja loguje cię automatycznie (jeżeli tylko jesteś zalogowany do fb / google'a).

Jednym słowem sesja zalogowanego użytkownika znajduje się na serwerze trzecim (facebook.com / google.com), ale dzięki odpowiednim mechanizmom jest ona udostępniana.

Wspomniany ajax jest pewnym rozwiązaniem, bo pozwoli zainicjować sesję, ale request musiałby być odpowiednio zaszyfrowany. Szczególnie jeśli zdecydujesz się przesłać nim dane logowania do drugiej witryny.

Więc odpowiadając na pytania:

punkt 2: po zalogowaniu na s1.pl musisz wysłać dane jednoznacznie identyfikujące usera na serwerze s2.pl, najlepiej ajaxem, bo to zainicjuje sesję na s2.pl. Ale do tego dochodzi problem z x-domain ajax request. I oczywiście zakładam, ża działasz po https.

punkt 3: nie ma żadnego już odwołania do s1.pl bo i po co? Podczas logowania do s1.pl użytkownik poprzez ajax request został zalogowany również na s2.pl. Po wejściu na s2.pl sesja już istnieje, i jest w niej informacja, że user jest zidentyfikowany i zalogowany (uzyskał autoryzację do zasobów).

BTW: jeżeli będą pracować na subdomenach to zrób to na jednej aplikacji;) wspólna sesja i problem z głowy;)

konto usunięte

Temat: Dwa serwisy - wspólne logowanie

Przemek Czekaj:
To chwila, jak to mają być subdomeny to wystarczy cookie, zobacz tu: http://blog.cylence.com/2008/11/30/cross-subdomain-coo... albo poszukaj po prostu w necie o cross sub domain cookie

Oczywiście w przypadku jednej aplikacji, ten artykuł też się przyda. Uważam, że w tym przypadku nie ma sensu tworzyć nowej aplikacji dla każdej subdomeny, bo ruch z subdomen można łatwo obsłużyć w jednej.
Michał Jastrzębski

Michał Jastrzębski Django-fu, phpjutsu,
sql-do

Temat: Dwa serwisy - wspólne logowanie

Piękno mojego rozwiązania polega na tym, że s2 nie ma w żadnym momencie kontaktu z haslem użytkwnika, i jest to właśnie to, co google zrobiło, czyli OAuth.

Spróbuję to opisać jeszcze raz, może uda mi się jaśniej.

Problem jest taki, że na s2 musimy identyfikować użytkownika, który ma konto i sesje na s1. Polega to na tym że tworzymy na s2 cookie z kluczem, który zwróci s1. Wtedy zawsze jak s2 odpyta serwera s1 dodając ten klucz, wiadomo o kogo chodzi, bo jest on przywiązany do użytkownika na s1. Najprostszym sposobem by s2 dostała ten klucz jest zalogowanie się na s1 a potem redirect z GETem na s2, gdzie w zmiennej GET masz ów klucz, który po redirect s2 wrzuca do ciacha.
Daniel Częstki

Daniel Częstki senior php developer

Temat: Dwa serwisy - wspólne logowanie

ale tutaj mówimy o różnych rzeczach.
Generalnie cookie musi zostać wysłane przez serwer w ramach domeny.
Nie jest możliwe jawne ustawienie cookie z domeny a1.pl dla domeny a2.pl.
Natomiast można to zrobić niejawnie i wydaje mi sie ze najlepiej poprzez AJAX.

Po porstu trzeba w momencie zalogowania do jednego serwisu automatycznie zalogowac do drugiego:

1. Formularz na domenie a1.pl
2. W momencie klikniecia w logowanie sie wywolujemy skrypt z domeny a2.pl który wyśle do przeglądarki cookie z odpowiednimi danymi zalogowanego uzytkownika
3. logujemy się do serwisu pod domeną a1.pl

konto usunięte

Robert P.

Robert P. Senior PHP Developer

Temat: Dwa serwisy - wspólne logowanie

Jeżeli to są strony całkowicie niezależne można zrobić to bardzo prymitywnie tj. na Stronie A wziąć i po przesłaniu danych post i zalogowaniu użytkownika przesłać te dane na drugą stronę np CURL-em nie jest to ładne rozwiązanie, ale zadziała. Wtedy obie strony przy logowaniu mogą ustawić cookie i spokój.

konto usunięte

Temat: Dwa serwisy - wspólne logowanie

Robert P.:
Jeżeli to są strony całkowicie niezależne można zrobić to bardzo prymitywnie tj. na Stronie A wziąć i po przesłaniu danych post i zalogowaniu użytkownika przesłać te dane na drugą stronę np CURL-em nie jest to ładne rozwiązanie, ale zadziała. Wtedy obie strony przy logowaniu mogą ustawić cookie i spokój.

złoty medal w kategorii "gównożeźbiarstwo artystyczne"

http://code.google.com/p/oauth-php/
Jan Janiak

Jan Janiak Programista

Temat: Dwa serwisy - wspólne logowanie

No właśnie, cross subdomain cookie.

Założenie: obydwa serwisy są w tej samej domenie, są na subdomenach.
Pytanie: takie manewry (http://blog.cylence.com/2008/11/30/cross-subdomain-coo... z obrazkiem są konieczne?

W ten sposób:
setcookie("cookie_name", $_GET['stuff'], time()+60*60*24*30, "/", ".takafajnadomena.pl");
ciastko będzie dostępne zarówno w
www.takafajnadomena.pl
jak i w
s2.takafajnadomena.pl
Dobrze myślę czy może pominąłem jakiś aspekt bezpieczeństwa lub inną istotną kwestię?
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: Dwa serwisy - wspólne logowanie

Jesli masz subdomeny a.domena.pl i b.domena.pl to kwestia konfiguracji cistek, jak koledzy wyzej napisali.

Jesli masz domena.pl i domenab.pl moze Cie zainteresowac sposob transferu tokenow przez paremtery adresu (jak ktos wspomnial Google tak loguje do swoich serwisow z glownej domeny). Dzieki temu ominiesz problem, ale nie jest to latwe. Kiedys implementowalem to dla pewnego klienta, jednak po zerwaniu wspolpracy storne niestety popsuli i tak juz pol roku wisi:/ wiec nie ma na co spojrzec.

Pomocny moze byc link:
http://softwareas.com/cross-domain-communication-with-...

Pozdrawiam
P
Tomasz Zadora

Tomasz Zadora programuję

Temat: Dwa serwisy - wspólne logowanie

Niech domena A po "ręcznym" zalogowaniu użytkownika wygeneruje token i wyśle go do systemu domeny B (przez HTTP GET lub POST), token jest ważny określony okres czasu (krótki). Tokenu musi być wygenerowany i wysyłany zanim pokaże się następna strona (potwierdzenie zalogowania etc.)

Zaraz po zalogowaniu niech przez wywołanie ajax do systemu domeny B, zostanie przekazany token a użytkownik zostanie zalogowany w systemie B. Token zostaje usunięty.

Oczywiście powinno to działać w dwie strony, czyli "ręczne" zalogowanie do B -> przesłanie tokenu do A.

Pownien zostać wywoływany skrypt co pewien czas (np. z crona) który będzie kasować przeterminowane tokeny.

Można wraz z tokenem przekazać np. IP usera aby lepiej zabezpieczyć mechanizm lub korzystać z SSL.Tomasz Zadora edytował(a) ten post dnia 20.07.12 o godzinie 15:01
Piotr Jasiulewicz

Piotr Jasiulewicz PHP/Java
professional

Temat: Dwa serwisy - wspólne logowanie

Tomasz Zadora:
Niech domena A po "ręcznym" zalogowaniu użytkownika wygeneruje token i wyśle go do systemu domeny B (przez HTTP GET lub POST), token jest ważny określony okres czasu (krótki). Tokenu musi być wygenerowany i wysyłany zanim pokaże się następna strona (potwierdzenie zalogowania etc.)

Zaraz po zalogowaniu niech przez wywołanie ajax do systemu domeny B, zostanie przekazany token a użytkownik zostanie zalogowany w systemie B. Token zostaje usunięty.

Oczywiście powinno to działać w dwie strony, czyli "ręczne" zalogowanie do B -> przesłanie tokenu do A.

Pownien zostać wywoływany skrypt co pewien czas (np. z crona) który będzie kasować przeterminowane tokeny.

Można wraz z tokenem przekazać np. IP usera aby lepiej zabezpieczyć mechanizm lub korzystać z SSL.


Masz jednak problem ciastek, chodzi o to, zeby sie zalogowac na oba miejsca jednoczesnie, Twoim sposobem co prawca na domenie na ktorej sie zalogowalismy, mamy ciacho i sesje, jednak na tym ktory w przypadku jest dostawca uslugi logowania - nie.



Wyślij zaproszenie do