Трехсторонняя проверка подлинности отношений. Как это настроить? - PullRequest
0 голосов
/ 08 марта 2011

Я внедрил аутентификацию в Facebook и Twitter в приложении, над которым я работаю, следуя отличным Railscasts по этой теме.

Пока что моя пользовательская модель подключена к Devise , и у меня есть встроенная модель аутентификации, и я записываю провайдеров аутентификации, когда пользователи регистрируются через них. Это выглядит так:

id | user_id | provider | uid
-----------------------------
1  |    1    | facebook | xyf
2  |    1    | twitter  | pfr
3  |    2    | facebook | sdf

Теперь, следующее, что мне нужно, это сохранить некоторые данные, которые эти поставщики omniauth предоставляют мне. Facebook, например, предоставляет пол пользователя и URL для их профиля в Facebook. С другой стороны, подключение к твиттеру предоставит различную информацию о пользователе.

Это наводит меня на мысль, что у меня должно быть две таблицы: одна для данных в Twitter (TwitterProfile) и одна для данных в Facebook (FacebookProfile).

Так я должен расширить свою модель аутентификации, как эта?

id | user_id | provider | uid | facebook_profile_id | twitter_profile_id
------------------------------------------------------------------------
1  |    1    | facebook | xyf |        1            |          
2  |    1    | twitter  | pfr |                     |         2
3  |    2    | facebook | sdf |        2            | 

и my models / user.rb будет выглядеть примерно так:

has_many :authentications, :dependent => :destroy
has_one :facebook_profile, :through => :authentications, :source => :facebook_profile
has_one :twitter_profile, :through => :authentications, :source => :twitter_profile

Но может ли моя модель аутентификации принадлежать 3 таблицам?

  belongs_to :user
  belongs_to :facebook_profile, :class_name => "FacebookProfile"
  belongs_to :twitter_profile, :class_name => "TwitterProfile"

Мне кажется, что я на неправильном пути, потому что в моей модели аутентификации есть избыточное пространство, и отношения кажутся слишком сложными.

1 Ответ

1 голос
/ 08 марта 2011

Возможно, вы захотите рассмотреть полиморфную ассоциацию. Скажем, ассоциация называется Профиль. По сути, ассоциация имеет единственный profile_id и строковый столбец profile_type, который указывает, какой тип профиля имеет каждая аутентификация.

Существует множество ресурсов, объясняющих, как это настроить, включая Railscast видео , раздел в Rails Guides , а также в Rails API .

...