2009-10-08 12 views
7

To jest pytanie o bazę danych. Mam już zainstalowaną i działającą bibliotekę.Przechowywanie informacji o identyfikatorze OpenID w bazie danych

Chcę używać OpenID na stronie, nad którą pracuję. Istnieją trzy rodzaje użytkowników.

  1. nazwanych kont z wykorzystaniem e-mail/hasło do uwierzytelnienia
  2. nazwanych kont OpenID do uwierzytelniania
  3. konto Anonymous OpenID do uwierzytelniania

wszystkich tych użytkowników są przechowywane w tej samej tabeli po prostu tabela komentarzy. Nazwane konta są połączone z blogiem, którym może zarządzać konto. Anonimowi użytkownicy mogą komentować artykuły na blogu, ale nie mogą robić nic innego. Jeśli anonimowy użytkownik zarejestruje się na koncie, chcę automatycznie przenieść stare komentarze tego użytkownika na wskazane konto. Obecnie robię to, wypełniając formularz z unikalną nazwą i prawidłowym adresem e-mail.

Obecnie oba zestawy kont są przechowywane w tej samej tabeli przy użyciu poniższego schematu. (Tak to jest migracja szyny)

create_table :users do |t| 
    t.string :name #unique because it maps to a subdomain 
    t.string :openid_url #unique 
    t.string :email #unique 
    t.string :password_hash 
    t.string :password_salt 
    t.boolean :guest #Anonymous user flag 

    t.timestamps 
end 

(openid_url jest wyjątkowy, aby zapobiec wielu kont z przyłączonym do tego samego identyfikatora OpenID. email jest wyjątkowy, ponieważ użytkownicy Zaloguj się email/hasło)

Używam tego setup Wystąpił problem z implementacją Google OpenID. Każdy użytkownik korzystający z Google dla OpenID ma ten sam URL: https://www.google.com/accounts/o8/ud.

Jak mogę korzystać z google jako dostawcy openid, ponieważ adresy URL nie są unikalne dla każdego użytkownika? (Pamiętaj o istniejących ograniczeniach)

Uwaga: Konta Google mogą używać dowolnego prawidłowego adresu e-mail w Internecie, więc nie mogę po prostu zapisać adresu [email protected] w polu openid_url, ponieważ adres e-mail może być np. Osobą. com lub gorzej [email protected]! Yahoo używa również tej metody pojedynczego adresu URL, więc muszę je również wspierać.

+0

Dlaczego mówisz, że adresy e-mail są unikatowe? Mogą nie być. Co się stanie, jeśli pojawi się drugie logowanie do systemu OpenID, a użytkownik zgłosi ten sam adres e-mail, który już posiadasz? –

+0

E-mail jest dla nazwanych kont, które nie używają openid. Od tego czasu zmieniłem aplikację, aby używać wyłącznie openidu. (Myślę, że wystarczająco dużo osób ma konta google/yahoo, z którymi nie będę miał problemu). – epochwolf

Odpowiedz

8

Zapisz wartość openid.claimed_id. Jest unikalny dla każdego użytkownika. Google OpenID są rzeczywiście unikatowe. Wszystkie zaczynają się od tej samej wartości, ale mają niepowtarzalne strunowe ?id=uniquenesshere. Pamiętaj, że wartości te powinny być traktowane z uwzględnieniem wielkości liter, więc zachowaj wielkość liter i dopasowanie w przypadku wyszukiwania użytkowników.

Zdecydowanie nie chcesz uważać adresów e-mail za unikatowe z podanych powodów, a dla większości Dostawców adres e-mail nie jest wstępnie weryfikowany (lub nie można ufać, że Dostawca to zrobił), więc Przechowywanie na adresie e-mail jest pewnym sposobem na ukradzenie tożsamości użytkowników.

-1

openid_url nie jest tutaj potrzebny.Tylko identyfikator użytkownika lub nazwa (unikalna) działa dla obu kont. Możesz także utworzyć oddzielną tabelę z openid i userid z tabeli UserAccount.

Powiązane problemy