Mam kilka miejsc w różnych dziedzinach: example.com
, example.org
, mail.example.com
i passport.example.org
. Wszystkie witryny mają wspólny wygląd i muszą mieć tę samą bazę użytkowników.Transparent użytkownik w ciągu kilku stron (single sign-on + pojedynczy znak-off)
A w takim skrajnym przypadku nadal chcę wszystkich miejsc do przejrzysty (w miarę możliwości) sesje użytkownika akcji z następujących kluczowych właściwości:
single sign-on. Gdy użytkownik wpisze się w
passport.example.org
i wizyty każda inna strona - powinien on być traktowany jako zalogowanyzalogowanych użytkowników dostać „Witam,
$username
„pozdrowienie w nagłówku witryny i innego menu nawigacji, wymieniając usługi mają dostęp. . Jeśli nie jest zalogowany, zamiast tego zamiast pozdrowienia pod numerem znajduje się link "Zaloguj się", wskazujący napassport.example.org/signon
.Lista zaufanych domen jest znana, więc jest dość prosta implementacja z OpenID lub z niewielkim protokołem homebrewn. Kiedy użytkownik najpierw trafi na stronę , przekierowuję go do punktu końcowego o specjalnym uwierzytelnieniu pod numerem
passport.example.org
, , który następnie po cichu przekierowuje go z powrotem wraz z informacjami o tożsamości (lub "niezalogowanym"). W przypadku większości przeglądarek jest to całkowicie przezroczyste. Oczywiście, używam wartości nonce do walki z pętlami przekierowania.Pojedyncze podpisanie. Kiedy użytkownik kliknie "wyloguj" w nagłówku dowolnej witryny następnym razem, gdy odwiedzi jakąkolwiek witrynę - powinien być postrzegany jako "niezalogowany".
OpenID nie został do tego zaprojektowany. Mój obecny pomysł (mam już częściowo działającą implementację ) polega na wysyłaniu nie token tożsamości użytkownika, ale "globalny" token sesji i udostępnianie tabeli globalnych sesji (global_session_token ↔ user relacji) w DB.
Roboty i użytkownicy bezobsługowe obsługują. Witryny mają publiczne obszary, które powinny być dostępne dla użytkowników bez obsługi plików cookie.
Z tego powodu przekierowanie, o którym wspomniałem (1), staje się problemem, ponieważ dla każdego pojedynczego żądania strony, skończę rzucać agent użytkownika do auth punktu końcowego iz powrotem. To nie tylko spowoduje zamieszanie w robotach, ale bardzo szybko spowoduje zanieczyszczenie sesji sesji sesji z porodem. I zdecydowanie nie chcę wyświetlać "hej, , jeśli nie masz włączonej obsługi plików cookie, odejdź!", Co byłoby wyjątkowo nieuprzejme i rozczarowujące. Chociaż do logowania potrzebuję obsługi plików cookie, chcę, aby użytkownicy mogli swobodnie czytać informacje o tym, do czego służą witryny i tak dalej - bez żadnych ograniczeń.
I jednoznacznie nie chcę, aby umieszczał identyfikatory sesji w adresach URL z wyjątkiem niektórych przezroczystych przekierowań między domenami, o których już wspomniałem. Wierzę, że robienie tego jest problemem z ochroną i ogólnie rzecz biorąc, złą rzeczą.
I tutaj prawie nie mam pomysłów.
Dobra, wiem, że to trudne, ale Google faktycznie robi to jakoś z (google.com
, google.
lot-of-gTLD, gmail.com
i tak dalej), prawda? To powinno być możliwe .
Byłbym wdzięczny za pomysły na opisy protokołów (byłoby to najlepsze) lub linki do systemów (kod do czytania lub po prostu na żywo witryn do oglądania i uczenia się) już z powodzeniem wdrażając coś takiego.
Podsumowując: Kilka domen bez wspólnego katalogu głównego, współużytkowanej bazy użytkowników, pojedynczego logowania, pojedynczego podpisu, bez plików cookie wymaganych do przeglądania anonimowego.
Wszystkie witryny znajdują się w tej samej sieci (ale znajdują się na różnych serwerach) i częściowo udostępniają tę samą bazę danych PostgreSQL (w ramach różnych schematów tej samej bazy danych). Większość stron jest napisanych w Pythonie/Django, ale niektóre z nich używają PHP i Ruby on Rails. Chociaż myślę o czymś agnostycznym i ramowym, jestem wdzięczny za wskazanie jakichkolwiek implementacji. Nawet jeśli nie będę w stanie ich użyć, jeśli wpadnę na pomysł, jak to się robi, być może będę w stanie wymyślić coś podobnego.
Nie, to nie jest trudne. To tylko sztuczka, na przykład sztuczki z kartami. Kiedy już wiesz, jak to jest łatwe. :-) –