Использование OpenID в качестве единственного метода аутентификации - PullRequest
9 голосов
/ 08 апреля 2010

Я прочитал другие вопросы, и они в основном говорят о безопасности этого. Это не совсем моя забота, в основном потому, что вопрос сайта - это браузерная игра. Тем не менее, большая проблема заключается в пользователе - не каждый пользователь достаточно грамотен, чтобы понимать 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 ]

4 голосов
/ 19 апреля 2010

Обеспечение доступности

Сначала о пользователях, у которых нет 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), чтобы иметь возможность войти в систему.

3 голосов
/ 08 апреля 2010

Arg, отвечая на мой предыдущий комментарий выше.

К вашему третьему вопросу "меры ... для предотвращения входа кого-либо в качестве другого пользователя ...", как я понимаю OpenId, вы никогда не принимаете URL-адрес OpenId из ненадежного источника. В реализации на вашем сайте размещается логин провайдера, сайт провайдера связывается с вами напрямую , поэтому вы всегда принимаете URL-адрес OpenId с доверенного сайта.

Другими словами, даже если злонамеренный пользователь собирает OpenIds, такие как Pokemon, у него нет средств для доступа к вашей системе.

На ваш второй вопрос "как мне хранить ..." ваша схема будет работать, хотя выглядит немного расслабленной. Например, используя сопоставление «многие ко многим» [т.е. UserID to OpenID], вы разрешаете пользователю принадлежать ко многим OpenIds, а один 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.

0 голосов
/ 08 апреля 2010

Я заметил один ответ на первый вопрос:

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

...