Использование OpenID в качестве единственного метода аутентификации
Я прочитал другие вопросы, и они в основном говорят о безопасности этого. Это не совсем моя забота, в основном потому, что вопрос сайта - это браузерная игра. Тем не менее, большая проблема заключается в пользователе - не каждый пользователь достаточно грамотен, чтобы понимать OpenID. Конечно, RPX делает это довольно легко, что я и буду использовать, но что, если у пользователя нет учетной записи в Google, Facebook или где-либо еще, или он не доверяет системе для входа в систему с существующей учетной записью? Они должны были бы получить учетную запись в другом представлении - я уверен, что большинство будет знать, как это сделать, не говоря уже о том, чтобы сделать это.
Существует также проблема того, как управлять этим в приложении. Пользователь может захотеть использовать несколько идентификаторов с одной учетной записью, поэтому это не так просто, как имя пользователя + пароль. Как мне сохранить идентификаторы OpenID пользователя в базе данных? Использование OpenID также дает мне преимущество: RPX может предоставить обширную информацию о профиле, так что я могу просто предварительно заполнить форму профиля и попросить пользователя отредактировать по мере необходимости.
В настоящее время у меня есть это:
Users:
------
ID Email Etc.
-- --------------- ----
0 bob@yahoo.com ...
1 alice@yahoo.com ...
UserOpenIDs:
------------
ID UserID OpenID
-- ------ ------
0 0 0
1 0 2
2 1 1
OpenIDs:
--------
ID Provider Identifier
-- -------- ----------------
0 Yahoo https:\\me.yahoo.com\bob#d36bd
1 Yahoo https:\\me.yahoo.com\alice#c19fd
2 Yahoo https:\\me.yahoo.com\bigbobby#x75af
С этими внешними ключами:
UserOpenIDs.UserID -> Users.ID
UserOpenIDs.OpenID -> OpenIDs.ID
Это правильный способ хранить идентификаторы OpenID в базе данных? Как бы я соответствовал идентификатору, который дал мне RPX, с идентификатором в базе данных для входа в систему пользователя (если идентификатор известен).
Итак, вот конкретные вопросы:
- Как сделать его доступным для пользователей, не имеющих OpenID или не желающих его использовать? (например, проблемы безопасности, например, вход в систему с использованием учетной записи Google)
- Как мне сохранить идентификатор в базе данных? (Я не уверен, что таблицы выше верны)
- Какие меры мне необходимо предпринять, чтобы кто-то не мог войти в систему как другой пользователь и с удовольствием делать что-либо со своей учетной записью? (как я понимаю, RPX отправляет идентификатор через HTTP, так что кто-то должен был бы просто как-то захватить его, а затем ввести его в поле "OpenID")
- Что еще нужно знать при использовании OpenID?
3 ответа
Сделать его доступным
Прежде всего, о пользователях, у которых нет OpenID, вы можете сделать небольшую страницу, которая объясняет, как создать учетную запись (или даже указать на некоторых поставщиков). Таким образом, создать учетную запись OpenID не сложнее, чем обычную учетную запись.
Для людей, которые не хотят использовать OpenID, у вас есть два варианта. Первый: внедрить учетную запись в старом стиле рядом с вашей учетной записью OpenID и позволить пользователям выбирать, какой метод они хотят. Второе - иметь только OpenID... это упрощает вашу работу. Сказать, что некоторые пользователи доверяют веб-сайту больше, чем доверенному провайдеру OpenID, на мой взгляд, довольно странно, поскольку провайдеры OpenID часто используют зашифрованные соединения и т. Д.
Хранение в базе данных
Схема, предложенная johnny g - это то, что вам нужно. (Я просто не знаю, почему вы храните URL с косой чертой вместо косой черты)
Возможно, вы захотите нормализовать свои URL-адреса перед их использованием, чтобы избежать таких вещей, как http://openid.test.com/abc и http://openid.test.com/abc/ которые рассматриваются как разные URL-адреса.
Дополнительные меры для принятия
Никто. Вы должны просто использовать библиотеку из http://openid.net/developers/libraries.
Подтверждение личности пользователя является проблемой провайдера. Только пользователь и сайт знают пароль к учетной записи.
Если у кого-то есть ваш OpenID URL (который является общедоступным), ему все равно нужен пароль (или другой метод аутентификации, такой как сертификат SSL), чтобы иметь возможность войти в систему.
Arg, отвечаю на мой предыдущий комментарий выше.
На ваш третий вопрос "меры... чтобы кто-то не мог войти в систему как другой пользователь...", как я понимаю OpenId, вы никогда не примете URL-адрес OpenId из ненадежного источника. В реализации на вашем сайте размещается логин провайдера, сайт провайдера связывается с вами напрямую, поэтому вы всегда принимаете URL-адрес OpenId с доверенного сайта.
Другими словами, даже если злонамеренный пользователь собирает OpenIds, такие как Pokemon, у них нет средств для доступа к вашей системе.
На ваш второй вопрос "как мне хранить..." ваша схема будет работать, хотя выглядит немного расслабленной. Например, используя отображение "многие ко многим" [т.е. UserID to OpenID
] вы разрешаете пользователю принадлежать ко многим OpenId, а один OpenId - ко многим пользователям. Вы хотите первое без последнего.
Достаточно простого ограничения внешнего ключа.
UserID Email
------ ---------------
86000 bob@yahoo.com
86001 alice@yahoo.com
UserID Identifier
------ ----------------
86000 https:\\me.yahoo.com\bob#d36bd
86000 https:\\me.yahoo.com\bigbobby#x75af
86001 https:\\me.yahoo.com\alice#c19fd
Предоставлена UserID
это внешний ключ к Users
таблица и есть уникальное ключевое ограничение на Identifier
по сути это User
имеет ноль или много уникальных Identifier
s. В принципе, я бы, вероятно, также ударил первичный ключ на этой таблице, но это подливка.
Надеюсь это поможет:)
PS Если у вас есть сомнения по поводу интеграции или использования OpenId, переходите к реализации. Определите каждый бит источника в URL-адресе OpenId, а затем спросите себя, возможно ли для злоумышленника доступ к этой точке входа. Я надеюсь, что есть только одна такая точка входа, и она недоступна для всех, кроме доверенных поставщиков OpenId.
Я заметил один ответ на первый вопрос:
Если пользователь не может или не хочет использовать OpenID, вступить в партнерские отношения с существующим провайдером и зарегистрировать его непосредственно на веб-сайте, или сам стать провайдером (хотя это означает, что у вас также есть классические учетные записи с именем пользователя и паролем и что-то не так) суть вопроса -> используя только OpenID).