OmniAuth: защита от нескольких учетных записей для одного и того же пользователя - PullRequest
27 голосов
/ 10 января 2011

У меня есть пара приложений на Rails, которые я хочу интегрировать с OmniAuth, но у меня есть концептуальная проблема, с которой я хотел бы разобраться в первую очередь.Рассмотрим следующий сценарий:

  1. Ваше приложение, Foo, поддерживает вход в OmniAuth через Twitter и Facebook.
  2. Джо заходит на ваш сайт и входит в систему через свою учетную запись Twitter.Это создает нового пользователя в Foo и связывает его с этой новой авторизацией в Twitter.
  3. Джо выходит из Foo и забывает о сайте на шесть месяцев.
  4. Джо возвращается в Foo, не помнячто он ранее вошел в систему через Twitter.
  5. Джо входит в систему через Facebook.Поскольку он еще не вошел в систему с помощью своей первоначальной авторизации в Твиттере, невозможно определить, что он на самом деле тот же Джо, и создается новая учетная запись.
  6. Джо обнаруживает свою старую учетную запись, итеперь разочарован тем, что его старый контент привязан к этой старой учетной записи, и что он не может войти в систему с помощью Twitter и Facebook взаимозаменяемо.

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

Единственное другое решение, которое я могу придумать, - этодать пользователю возможность объединить две существующие учетные записи.Это большая головная боль по сравнению с относительной простотой всего остального при использовании OmniAuth.Если это единственное решение, кто-нибудь сталкивался с руководством / учебником, показывающим пример того, как это можно сделать?Я удивлен, что этой проблеме не уделяется больше внимания, учитывая популярность OmniAuth.

Спасибо!

Ответы [ 4 ]

7 голосов
/ 10 января 2011

Ваше чувство кишки правильное.Вы должны будете предоставить инструмент слияния для вашего пользователя ... или вы можете игнорировать проблему.

6 голосов
/ 05 января 2013

Я знаю, что это старый вопрос, но подумал, что в любом случае отвечу тем, что я недавно сделал над проектом, просто для справки.

Полное раскрытие: я не придумал это, я украл это у кого-то еще в сети. Есть хорошая статья на вики Omniauth .

Я никогда не находил хороший способ автоматически связать учетные записи Facebook / Twitter / и т. Д., Но вместо этого сделал так, чтобы пользователь мог связать несколько учетных записей, как только они вошли с первой.

Это сценарий:

  • Пользователь входит в систему, например, с помощью Facebook
  • У них есть страница профиля, на которой перечислены социальные сети, которые они прикрепили к учетной записи, и возможность привязать каждый тип к учетной записи.
    • например, "Facebook Linked | Link Twitter | Link Google"
  • «Ссылка на Твиттер», например, ссылки на то же действие всевозможного пользователя, которое пользователь будет использовать для входа в Твиттер
  • в обработчике обратного вызова, проверьте, вошел ли пользователь в систему
    • если они есть, сохранить провайдера и uid в отдельной записи для пользователя
    • в противном случае, войдите в систему как обычно

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

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

3 голосов
/ 22 января 2011

Я тоже сегодня сталкивался с этой проблемой.Я думаю, что справлюсь с этим следующим образом:

Я буду просить пользователя при входе в систему указать его адрес электронной почты и пароль, как в традиционной настройке аутентификации, где я пытаюсь получить письмо от службы OmniAuth.пользователь выбрал (FB, Twitter, ...).Таким образом, они должны предоставить электронную почту, только если она не предоставлена ​​провайдером аутентификации.Затем, если пользователь войдет позже с тем же провайдером, которого он использовал для регистрации, он сразу же войдет в систему.Это, вероятно, произойдет в 99% всех случаев.

Однако, имея электронную почту и пароль пользователя, я также могу обрабатывать все виды случаев, которые могут возникнуть (включая описанный вами):

  • Исходный поставщик проверки подлинности не работает или пользователь удалил свою учетную запись поставщика проверки подлинности -> Решение. Пользователь может войти в систему традиционным способом, используя свой адрес электронной почты и пароль.(Обратите внимание, что это важный случай, который я еще нигде не упоминал в сети. Люди, кажется, полагают, что FB, Twitter и т. Д. Будут существовать вечно, никогда не будут закрыты, и пользователи никогда не закроют свои учетные записи суслуги. Не сохраняя пользователей pw и email, вы потеряете все свои учетные записи, которые были созданы провайдером в случае возникновения одного из этих случаев, так как вы больше не можете сопоставить их с пользователями. Для меня это неприемлемая зависимость отвнешняя служба.)

  • Пользователь регистрируется позже с другим поставщиком аутентификации (это ваш случай) -> Решение. Попробуйте сопоставить пользователя с существующей учетной записью, используя его электронную почту, еслиесли это не удалось, отобразите форму регистрации с помощью кнопки / ссылки «У меня уже есть аккаунт, войдите в систему» ​​(или аналогичного ;-).Если они нажимают это, они должны предоставить свой адрес электронной почты и пароль.Затем, если они успешно проходят аутентификацию, вы можете просто добавить этого провайдера в существующую запись пользователя, и в следующий раз они сразу же войдут в систему, как и в случае с провайдером, которого они первоначально использовали для регистрации ...

Может быть, есть и другие случаи, которые могут произойти.Любая обратная связь?

2 голосов
/ 10 января 2011

Я заметил, что переполнение стека, по-видимому, пытается в некоторой степени решить эту проблему, сохранив настройку аутентификации пользователя в файле cookie и автоматически войдя в систему, когда вы вернетесь на страницу входа.

Несмотря на то, что он до сих пор не дает полного решения этой проблемы, он, вероятно, помогает минимизировать выпадение.

...