Может ли Devise + Omniauth иметь несколько типов входа? - PullRequest
6 голосов
/ 15 августа 2011

Я использовал Devise как стандартную аутентификацию для других проектов. В другом проекте я использовал Devise + Omniauth для аутентификации в Twitter.

В новом проекте мне нужно, чтобы мои конечные пользователи могли войти через Twitter и Facebook или зарегистрироваться через приложение. В будущем пользователь может связать свои учетные записи вместе. Например, его аккаунт в Twitter и Facebook. Или его твиттер и "родной" аккаунт. «Нативный» - это учетная запись, которую он зарегистрировал непосредственно в веб-приложении.

Способен ли Devise на такое? Если да, то как мы можем связать учетные записи пользователей вместе? Какова концепция этого? Как приложение узнает, какая учетная запись Facebook и Twitter принадлежит какому пользователю?

Идеи и предложения приветствуются.

EDIT:

Я следил за http://railscasts.com/episodes/236-omniauth-part-2?autoplay=true и то, что я не понимаю, это. Если

  1. пользователь вышел из приложения,
  2. У пользователя есть аккаунт, зарегистрированный в приложении,
  3. пользователь входит в систему с другим поставщиком услуг (Facebook, Twitter, и т.д.).

Как приложение узнает, как связать своего нового поставщика услуг с уже существующими учетными записями?

Stackoverflow.com имеет эту функцию. Но одним из поставщиков услуг, которого они не включают в свою функцию «мульти-подписи», является Twitter. Я предполагаю, что это потому, что Twitter не раскрывает электронную почту пользователя через его API. В то время как другие поставщики услуг (Facebook, Yahoo, Gmail) это делают.

Ответы [ 4 ]

3 голосов
/ 16 августа 2011

Электронная почта обычно используется для связывания всех учетных записей, но в Twitter вы не можете получить учетную запись электронной почты.Использование электронной почты не очень хорошая практика, поскольку пользователь не обязательно регистрируется в каждой службе с одним и тем же адресом электронной почты.

Спрашивает пользователя, хочет ли он один раз использовать аутентификацию facebook / twitter / google / openid для аутентификациион вошел в систему самым простым и предсказуемым способом для пользователя.Вы должны предотвратить эффект «откуда этот сайт узнает мою учетную запись Facebook? Почему они отслеживают меня?»

В качестве примечания, самая сложная часть - это не добавление нового метода аутентификации, а объединение учетных записей, еслиПользователь, например, создал одну учетную запись с Facebook, а другую с Twitter.

1 голос
/ 16 августа 2011

Devise вполне на это способен, но, поскольку у каждого провайдера есть свой токен, вам нужен способ распознавания пользователя независимо от того, с каким провайдером он выбрал вход в систему.

Самый распространенный способ сделать этоИспользуя поле электронной почты, вам нужно запрашивать электронную почту в каждом запросе провайдера, мне лично это не нравится, потому что у пользователей могут быть разные электронные письма у разных провайдеров.

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

1 голос
/ 15 августа 2011

Пожалуйста, посмотрите на этот скринкаст, он вам поможет: OmniAuth

и OmniAuth part2

Недавно я играл с такой проблемой, как сейчас. Я стремился реализовать множество решений для аутентификации: Google, Twitter, Facebook ... одновременно - чтобы пользователь мог войти в систему с несколькими провайдерами (как в Stackoverflow.com), а после выхода он оставался в системе с другой службой. Я реализовал это, создав следующую схему (сейчас у меня нет своего кода, но он должен дать вам подсказку):

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

Когда пользователь входит в систему, я проверяю таблицу KnownAuthentifications для текущей службы авторизации по электронной почте (служба OpenID передает электронную почту с другими параметрами, OAuth - нет (поэтому здесь я создаю поддельную электронную почту, скажем, fake@email.com -> так что Devise do не сквозные, кроме в)). Теперь я знаю, что пользователь, вошедший из Google, такой же, как пользователь, вошедший из Twitter.

0 голосов
/ 23 декабря 2011

У меня такой же вопрос, и хотя это не полное решение (я не думаю, что оно действительно на 100% надежно), это то, что я строю сейчас.

Пример: сайт с именем пользователя / паролем, Facebook и Twitter для аутентификации.

Пользователь заходит на сайт и хочет зарегистрироваться. Они регистрируются с помощью Twitter для аутентификации. Твиттер передает кучу информации, кроме адреса электронной почты. Я храню информацию профиля (местоположение, имя и т. Д.), Которая, по моему мнению, будет полезна для сравнения. Сразу после аутентификации пользователю предоставляется страница профиля для проверки информации профиля (они могут удалить любую информацию, которую не хотят хранить). У них также есть возможность добавить дополнительные методы аутентификации (в этом случае имя пользователя / пароль и Facebook). Чем больше вы будете поощрять их связывать дополнительные методы аутентификации при входе в систему, тем меньше будет проблем с дублирующимися учетными записями. Однако это все еще существует как крайний случай.

Сценарий пограничного случая выглядит следующим образом: пользователь регистрируется в Twitter, а затем сразу же выходит из системы и пытается войти в систему с помощью Facebook. Метод входа обнаруживает, что это новая аутентификация, поэтому он сравнивает данные oauth из Facebook с существующей информацией профиля и пытается найти совпадения. Затем я отображаю топ-10 или около того совпадений и прошу пользователя проверить, существуют ли они уже, чтобы можно было связать аккаунт. Попросите пользователя войти в систему с помощью Twitter, а затем связать учетную запись Facebook.

Очевидно, что это было бы проще и проще, если бы все использовали один и тот же адрес электронной почты, а Twitter фактически возвращал адрес электронной почты. Но не все делают это, поэтому вы должны обрабатывать этот крайний случай наилучшим образом - в этот момент я попробую выбрать соответствующий вариант и просто подтолкну пользователей к аутентификации с другими сервисами, когда они зарегистрируются и заполнят информацию профиля.

...