Интеграция openID и oauth в качестве системы входа в систему, входа в систему и аутентификации - PullRequest
16 голосов
/ 02 июня 2011

Прежде всего позвольте мне сказать, что этот вопрос не о разных реализациях openID и oAuth. Есть много классов об этом.

Мой вопрос: что делать после аутентификации пользователя:

  • Как добавить этого пользователя в таблицу пользователей в базе данных?
  • Как обрабатывать разные логины для одного и того же пользователя? (пример Реми Шарпа предлагает что-то для openID)
  • Как объединить oAuth и openID в базе данных?

Есть идеи?

Ответы [ 3 ]

12 голосов
/ 07 июня 2011

Ваш вопрос состоит из основных частей к нему:

  1. Аутентификация
  2. Авторизация

Обычно к ним не относятся по-разному, если провайдер идентификации (IP) является вашим, что до сих пор было наиболее распространенной настройкой в ​​веб-приложениях.

При использовании провайдера OpenId, такого как Google, часть аутентификации отделена от вашего контроля. Вы получите обратно токен, сообщающий, аутентифицирован ли пользователь или нет. Маркер обычно содержит следующие утверждения: имя, адрес электронной почты и именованный идентификатор, где последним является уникальный идентификатор идентификатора на IP-адресе.

Пока все хорошо.

Трюк теперь, как вы спрашиваете, как мне авторизовать этого пользователя ?

ну, есть несколько подходов к этому.

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

Тогда, как избежать повторной регистрации пользователя, если он переключается с Google на Facebook в качестве IP-адреса?

Здесь все становится сложнее. Наиболее распространенное утверждение, которое Google, Yahoo, Facebook предоставят вам, - это адрес электронной почты и имя. Итак, что вы можете сделать, так это попытаться сопоставить входящую заявку с существующими клиентами в вашем приложении. Однако это не безопасно, поскольку в разных системах люди могут получать разные электронные письма.

Значение имени также небезопасно.

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

Поскольку вход в систему зависит от времени, мы создали простую таблицу SQL, которая отображает внешние идентификаторы на номера наших клиентов. Это позволяет нам реализовать такую ​​логику проверки за пределами всех наших веб-приложений (и тем самым уменьшить избыточность кода)

8 голосов
/ 02 июня 2011

Мне кажется, что самый простой способ - иметь базовую таблицу пользователей, в которую вы добавляете пользователя в реестр, и дополнительную таблицу 1: n, в которой вы сохраняете возможные аутентификации.Возможно, вам нужно более одной таблицы, если есть методы, которым нужно больше столбцов, чем другим.

0 голосов
/ 05 июня 2011

Я ввел логин через OpenID от Google и столкнулся с похожими проблемами.Я использовал openid library от janrain.

Я не создал отдельную таблицу для openid.Вместо этого я использовал вторичные электронные письма (вторичные электронные письма хранятся в таблице пользователей).

При входе в систему через Google можно требовать электронные письма от пользователей (я полагаю, что у любого другого поставщика openid есть такая же возможность).После того, как я получил ответ от Google, что пользователь вошел в систему, я смотрю в таблице пользователей.Если в таблице было найдено предоставленное письмо (не имеет значения, является ли оно основным или второстепенным), я захожу в систему.Если электронная почта не найдена, я спрашиваю пользователя, имеет ли он учетную запись.Если да, ему предлагается войти с существующим логином / паролем, после этого я добавляю дополнительный адрес электронной почты пользователю.Если у пользователя нет учетной записи, создается новая учетная запись.

Так что вам не нужны новые специальные таблицы для этих трюков.

...