Autentykacja do kilku aplikacji naraz

Mam dwie lub więcej osobnych aplikacji. Chciałbym, żeby użytkownik po zarejestrowaniu się do jednej, mógł zalogować się z tym samym loginem do wszystkich pozostałych. Wszelkie OpenID, Facebookloginy itp odpadają. Koncepcyjnie zrobiłbym jedną bazę służącą z loginami, crypted password i się z nią łączył przy autentykacji. Robił ktoś coś takiego, czytał o tym, a najlepiej znalazł jakieś pluginy?

Właśnie się wgłębiamy w podobną tematykę - zależy nam na rozdzieleniu aplikacji na kilka prawie niezależnych części. Próbujemy przebrnąć przez OAuth i OpenID - idzie ciężko. OAuth-a chyba nikt nie używa RoR - gem w nienajlepszym stanie, szczątkowe informacje na jego temat. Z OpenID też nienajlepiej to wygląda. Może ma ktoś jakieś doświadczenia w tej kwestii?

Ja używałem OpenID do tego celu. Przykładowy kod serwera jest w bibliotece do rubiego – najlepiej na tym się oprzeć. Wystarczyły stosunkowo małe zmiany, stworzyć ciasteczko dostępne dla wszystkich domen z nazwą zalogowanego użytkownika aby to działało, sprawdzając czy użytkownik rzeczywiście się zalogował, i użytkownik po zalogowaniu w jednej aplikacji był zalogowany w pozostałych.

Ogólnie moje rozwiązanie polegało na połączeniu OpenID z ciasteczkiem, tak aby nie trzeba było wpisywać swojego openid url w każdej z aplikacji – wystarczy zalogować się raz.

Ciasteczko z odpowiednim podpisem ma się rozumieć? Możesz udostępnić jakiś przykładowy kod?

A może po prostu zestawić własne SSO (Single Sign-On)? W jednej z aplikacji korzystałem z rubycas-server (http://code.google.com/p/rubycas-server/), było to ponad rok temu, więc nie wiem, jak to teraz wygląda. W każdym razie w zeszłym roku takie rozwiązanie działało (z CAS serwera korzystała aplikacja w Railsach i w PHP, o ile dobrze pamiętam).

Nie, po co podpis? Ciasteczko służy tylko do tego nasz system-klient wiedział za kogo użytkownik się podaje. Jako że system-serwer sprawdza czy aby na pewno dany użytkownik jest tym za kogo się go uważa i że jest zalogowany, ciasteczko to może być czystym tekstem.

Idea polega na tym:

  1. Użytkownik wchodzi na stronę serwera OpenID i się tam loguje. Odpowiednia sesja dla niego jest tworzona aby zapamiętać że logowanie się powiodło. W międzyczasie ustawiasz ciasteczko które mówi jako kto jest zalogowany użytkownik.

  2. Kiedy użytkownik chce wejść do zabezpieczonego obszaru aplikacji która jest tu klientem OpenID, następuje próba weryfikacji na podstawie ciasteczka z loginem. Odpowiednia komunikacja pomiędzy aplikacjami ustanawia sekret, użytkonik na_chwile jest przekierowywany do serwera OpenID, tam nastepuje weryfikacja że rzeczywiście jest zalogowany.\

  3. Jeśli autentyfikacja powiodła się, użytkownik wraca do aplikacji-klienta, w URLu zakodowany jest sekret wcześniej ustalony pomiędzy aplikacjami i na tej podstawie wiadomo kto odwiedził aplikację-klienta.

Mam nadzieję że nie pomieszałem za mocno, to było 1.5 roku temu jak to pisałem :). Kodu chyba wkleić nie mogę… ale się upewnię jeszcze.

Temat jest złożony i różnie można do niego podejść.
@GhandaL wzpomniał o CAS i wskazał dobry kierunek. Też myślę, że to dobre rozwiązanie korzystać z CAS. Warto skorzystać i mieć temat z głowy.
Zainteresuj się rozwiązaniem poprzez Rack middleware a mianowicie zerknij na http://github.com/gcnovus/casrack_the_authenticator
Ma małe ograniczenia bo też tylko podstawowe możliwości są zaimplementowane. Mimo to spokojnie wystarcza, a i też łatwo tego Racka rozwinąć.

W tym miesiącu będę podchodził do tego tematu i na 99% wybieram to rozwiązanie. Jeśli coś out-of-space wypadnie to dodam komentarz.

Zaczęliśmy używać OAuth - bardzo ciekawe rozwiązanie. Kod przykładowych aplikacji leży u mnie na githubie ( http://github.com/qoobaa/oauth-example ). Mam natomiast inny problem - kilka tabel jest wspólnych dla obu aplikacji (chodzi mi o tabele słownikowe takie jak państwa, języki i kilka innych). Tabele te w teorii nie będą się zmieniać (przynajmniej nieczęsto), jak najlepiej udostępnić je w obu aplikacjach?

Wspólna baza dla tych wspólnych danych? A potem to już oczywista oczywistość, czyli odpowiedni wpis w database.yml i model estabilish connection :slight_smile:

Jeżeli to tylko tabele słownikowe, to ja bym nie robił wspólnej bazy tylko rake’a, który je ze sobą synchronizuje. Jeżeli się rzadko zmieniają, to jak już się zmienią, wystarczy uruchomić rake’a i po krzyku.

Też właśnie o tym pomyślałem - za takim rozwiązaniem przemawia fakt, że dane można synchronizować np. z pliku XML (pociągniętego z API), niekonieczny jest dostęp do bazy danych.

Jeszcze co do oryginalnego posta – bawił się ktoś tym: http://github.com/hassox/warden ?

Tylko na tyle zeby zobaczyc czy dziala :slight_smile:

Najwiekszy plus to to, ze nie zalezy od bazy danych ani orm, wiec dziala z MongoDB: https://gist.github.com/35ef33590789a1dc5e0c

No fajne rzeczywiście. Ale z tego co widzę działa tylko w obrębie jednej instancji Racka – czyli nie zadziała przy dwóch odległych serwerach…

RE-WE-LA-CJA !
Czuję się zniszczony, idę się tym pobawić :smiley:

W temacie: http://blog.plataformatec.com.br/2009/10/devise-flexible-authentication-solution-for-rails/

Czy za pomocą Wardena można zrealizować żeby sesja dla paru aplikacji, na różnych domenach (ale oczywiście na tej samej maszynie) była współdzielona miedzy aplikacjami ? Tabela użytkowników była by wspólna, ale chciałbym żeby po zalogowaniu do jednej użytkownik nie musiał się logować od nowa po przełączeniu na inną.
Jakie wady ma to rozwiązanie:

http://blog.startika.com/2008/3/27/sharing-sessions-between-rails-apps/

bo wydaje się tak proste że aż podejrzane :slight_smile:

O stary temat a ja właśnie wczoraj spinałem aplikację railsową z Vanilla Forum 2.0 (+plugin SSO). Polecam się przyjrzeć, bo konfiguracja po stronie Rails to 5 minut - 1 akcja w kontrolerze + poprawna domena dla cookies.

@Artur79: Wardena nie znam, ale to o czym piszę jest rozwiązane dokładnie jak w tym poście:

config.action_controller.session = { :domain => ".domain.com" }

i aplikacja działająca na http://domain.com, a druga (forum) na http://forum.domain.com

trochę odgrzeje temat. czy Devise wspiera jakoś autentyfikacje pomiędzy różnymi domenami ? ktoś wyżej wspominał o warden, a na nim jest Devise oparte