2011-08-15 11 views
6

Użyłem Devise jako standardowego klejnotu uwierzytelniania dla innych projektów. W innym projekcie użyłem Devise + Omniauth do uwierzytelniania Twittera.Czy Devise + Omniauth może mieć kilka typów logowania?

W nowym projekcie potrzebuję moich użytkowników końcowych, aby móc zalogować się za pośrednictwem Twittera i Facebooka lub aby móc zarejestrować się za pośrednictwem aplikacji. W przyszłości użytkownik może łączyć swoje konta. Na przykład jego konto na Twitterze i Facebooku. Lub jego Twitter i "rodzimy" konto. "Native" to konto, które zarejestrował bezpośrednio w aplikacji internetowej.

Czy Devise jest zdolny do takich? Jeśli tak, jak połączyć konta użytkowników? Jaka jest tego koncepcja? W jaki sposób aplikacja wie, które konta Facebook i Twitter należą do jakiego użytkownika?

Przyjęcie pomysłów i sugestii.

EDIT:

Śledzę http://railscasts.com/episodes/236-omniauth-part-2?autoplay=true i co ja dont dostać to. Jeśli

  1. użytkownik jest wylogowany z aplikacji,
  2. użytkownik ma konto zarejestrowane z aplikacji,
  3. użytkownik loguje się z innego usługodawcy (facebook, twitter, etc).

W jaki sposób aplikacja może powiązać swojego nowego dostawcę usług ze swoimi już istniejącymi kontami?

Stackoverflow.com ma tę funkcję. Ale jeden usługodawca, którego nie uwzględnia w swojej funkcji "wielu znaków", to Twitter. Zgaduję, że to dlatego, że Twitter nie udostępnia wiadomości e-mail użytkownika za pośrednictwem interfejsu API. Podczas gdy inni usługodawcy (Facebook, Yahoo, Gmail) to robią.

Odpowiedz

3

Wiadomości e-mail są zwykle używane do łączenia wszystkich kont, ale z usługą Twitter nie można pobrać konta e-mail. Korzystanie z e-maila nie jest dobrą praktyką, ponieważ użytkownik niekoniecznie musi zarejestrować się w każdej usłudze z tym samym adresem e-mail.

Pytanie użytkownika, czy chce używać Facebooka/twitter/google/openid do uwierzytelniania po zalogowaniu, jest najprostszym sposobem i bardziej przewidywalnym dla użytkownika. Musisz zapobiec efektowi "w jaki sposób ta witryna zna moje konto na Facebooku? Dlaczego mnie śledzą?"

Na marginesie, najtrudniejszą częścią nie jest dodanie nowej metody uwierzytelniania, ale scalenie kont, jeśli użytkownik, na przykład, utworzył jedno konto z Facebookiem i jedno ze świergotem.

+0

Dobre wyjaśnienie. Czy jest to główny powód, dla którego Stack Overflow nie umożliwia uwierzytelniania na Twitterze? –

+0

To prawdopodobnie powód. Powinieneś zapytać bezpośrednio administratorów, może za tym stoi także polityczny powód. –

+1

Stackoverflow nie obsługuje Twittera z powodu używania OAuth 1.0, czytałem na blogu, że było to trudne do zintegrowania z ich obecnym systemem. Posiadanie przez użytkownika loginu, a następnie dodanie innego konta pod swoją nazwą użytkownika, wydaje się być najlepszą techniką. Tak właśnie działa SO. http://meta.stackexchange.com/questions/74551/enable-authentication-via-twitter-oauth – Ash

1

Proszę spojrzeć na tego screencasts, to pomoże: OmniAuth

i OmniAuth part2

Ostatnio I'he grał z takim problemem, jak masz teraz. Celem było wdrożenie wielu rozwiązań uwierzytelniających: Google, Twitter, Facebook .. w tym samym czasie - dzięki czemu użytkownik może logować się z wieloma dostawcami (np. W Stackoverflow.com), a po wylogowaniu pozostaje zalogowany w innej usłudze. I wprowadziły to poprzez stworzenie następny schemat (nie mam mój kod teraz, ale powinna dać wskazówkę):

class User 
has_many :authentications 
has_many :known_authentications 
end 

class Authentication 
    #implemented nearly as in Ryan's Railscasts (It keeps authorization info) 
end 

class KnownAuthentications 
    #has :provider, :user_id, :uid and :email columns. Here I keep all authorizations for registered user, that he ever had(so I can verify user by email and guess that this is the same user as logged in from different services). I fill this table when user registers with any service(Google, Twitter etc.). 
end 

Kiedy logges Użytkownika w sprawdzasz KnownAuthentifications stół do bieżącej obsługi autoryzacji przez e-mail (usługa OpenID przekazać wiadomość e-mail z innymi parametrami, OAuth - nie (więc tutaj tworzę fałszywą wiadomość e-mail, powiedzmy [email protected] -> więc Devise nie przechodź przez excepts)). Wiem, że teraz użytkownik zalogowany w Google jest taki sam jak aktualnie zalogowany na Twitterze.

+0

Zobacz moją zmianę powyżej –

+0

Sprawdź mój zaktualizowany post, mam nadzieję, że to da ci wskazówkę, aby rozwiązać ten problem. Może moje rozwiązanie nie jest całkiem dobre, ale działa dla mnie (jak w Stackoverflow.com :)) – bor1s

1

Devise jest w pełni zdolny do tego, ale ponieważ każdy operator ma swój własny znak potrzebny jest sposób rozpoznawania użytkownika, bez względu na to, z którym dostawca on zdecydował się zalogować.

Najczęstszym sposobem, aby to zrobić korzystając z pola adresu e-mail, należy poprosić o wiadomość e-mail w każdym żądaniu dostawcy, osobiście tego nie lubię, ponieważ użytkownicy mogą nadal otrzymywać różne wiadomości e-mail od różnych dostawców.

Aby temu zaradzić, możesz podać opcję "Połącz mój login na Facebooku z moim loginem na Twitterze".

+0

Zobacz moją edycję powyżej –

0

Mam to samo pytanie i chociaż nie jest to kompletne rozwiązanie (nie sądzę, że tak naprawdę jest w 100% niezawodny), to właśnie teraz buduję.

Przykład: witryna z nazwą użytkownika/hasłem, Facebook i Twitter w celu uwierzytelnienia.

Użytkownik wchodzi na stronę i chce się zarejestrować. Rejestrują się za pomocą Twittera w celu uwierzytelnienia. Twitter przekazuje kilka informacji oprócz adresu e-mail. Przechowuję informacje o profilu (lokalizacja, nazwisko itp.), Które moim zdaniem przydadzą się do porównań. Użytkownik otrzymuje stronę profilu natychmiast po uwierzytelnieniu, aby zweryfikować informacje o profilu (mogą usunąć wszelkie informacje, których nie chcą przechowywać). Mają także możliwość dodania dodatkowych metod uwierzytelniania (w tym przypadku nazwa użytkownika/hasło i Facebook). Im bardziej zachęcisz je do połączenia dodatkowych metod uwierzytelniania podczas logowania, tym mniej kłopotów będziesz mieć ze zduplikowanymi kontami. Jednak nadal istnieje jako przypadek graniczny.

Scenariusz krawędziowy wygląda następująco: użytkownik rejestruje się na Twitterze, a następnie natychmiast się wylogowuje i próbuje zalogować się za pomocą Facebooka. Metoda logowania wykrywa, że ​​jest to nowe uwierzytelnienie, więc porównuje dane oauth z Facebooka z istniejącymi informacjami o profilu i próbuje znaleźć dopasowania. Następnie wyświetlam 10 najlepszych dopasowań i poproszę użytkownika o sprawdzenie, czy już istnieją, aby można było połączyć konto. Niech użytkownik zaloguje się za pomocą Twittera, a następnie połączy konto Facebooka.

Oczywiście byłoby łatwiej i prościej, gdyby wszyscy używali tego samego adresu e-mail, a Twitter rzeczywiście zwróciłby adres e-mail. Ale nie wszyscy tak robią, więc musisz radzić sobie z tą skrajną sprawą w najlepszy możliwy sposób - w tym momencie spróbuję dopasować opcję i popchnę użytkowników do uwierzytelnienia się z innymi usługami podczas rejestracji i wypełniania informacji profilowych.

Powiązane problemy