2010-06-24 2 views
5

Я играл с библиотекой OpenID PHP от JanRain, в основном следуя вместе с a tutorial I found on ZendZone.Как отличить/идентифицировать пользователей с OpenID без запроса полей SReg?

Как различить пользователей - особенно пользователей Google, которые все используют один и тот же URL OpenID, https://www.google.com/accounts/o8/id?

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

Чтобы отличить пользователей, в учебнике используется запрос «Простая регистрация» для запроса электронной почты пользователя поставщика OpenID, а затем используйте адрес электронной почты, чтобы узнать, является ли это возвращающимся пользователем.

Это не работало для меня, и apparently won't work with some providers, поэтому я был взволнован, когда наткнулся на функцию getDisplayIdentifier.

require_once "Auth/OpenID/Consumer.php"; 
require_once "Auth/OpenID/FileStore.php"; 
// create file storage area for OpenID data 
$store = new Auth_OpenID_FileStore('/wtv'); 
$consumer = new Auth_OpenID_Consumer($store); 
$oid_response = $consumer->complete("http://example.com/oir_return"); 
if ($oid_response->status == Auth_OpenID_SUCCESS) { 
    $hopefullyUniqueUserID = $oid_response->getDisplayIdentifier(); // I assumed this would be a relatively permanent way to identify the user... 
              // I was wrong. 
} 

К сожалению, через пару часов значение, возвращенное getDisplayIdentifier изменений.

+0

Пожалуйста, внимательно прочитайте спецификацию. 'https: // www.google.com/accounts/o8/id' - это предоставленный пользователем идентификатор, пользователь не обязательно утверждает, что он владеет им, его цель может просто указывать пользователю на выбор идентификатора, равно как и дело с Google. – Artefacto

ответ

2

Проблема в том, что Google's OpenIDs are Unique Per-Domain; Я отсутствовал единомышленно, чередуя между http://www.mysite.com и http://mysite.com, что заставило URL-адрес идентификатора OpenID изменить!

1

Почему бы просто не использовать URL OpenID для идентификации пользователей? Считайте его уникальным, как адрес электронной почты.

+0

Я подумал, что так оно и работало, но он говорит, что видит всех пользователей Google из одного и того же URL OpenID. – Rup

+0

Как и я, но в аккаунтах Google всегда есть https://www.google.com/accounts/o8/id 'как их URL. –

+0

ах, пропустил ту часть. – Echo

5

Снимая код, я думаю, что это $oid_response->identity_url, которого вы хотите. Для меня (хотя в DotNetOpenAuth не PHP-OpenId), который возвращается в

https://www.google.com/accounts/o8/id?id=AItOawmqjknrgk6f9cNdPIVxW43GewJPa1ZW4GE

от Google, где ID часть является воспроизводимым и, надеюсь, уникальный для меня. Однако я не оставил его несколько часов, чтобы узнать, не изменилось ли это, поэтому приносите извинения, если это то, что вы уже получили от getDisplayIdentifier, - но, сжимая источник, похоже, что он просто использовал первую часть, но тогда я не PHP-эксперт.

+0

Это похоже на то, что '$ oid_response-> getDisplayIdentifier()' дал мне ... и я оставил его несколько часов, и он изменился: '(Тем не менее, я попробую. –

+0

Ах, ОК - извините – Rup

+0

+ 1 - проверяется через несколько часов, кажется, не меняется ... –

1

В соответствии с последним абзацем ниже, вы должны обязательно использовать атрибут объекта ответа identity_url (предоставлен, это в отношении библиотеки Python, но реализации очень похожи):

Идентификатор дисплея связан с Идентифицированным Идентификатором, но два не всегда идентичны. Идентификатор дисплея - это то, что пользователь должен распознавать то, что они ввели, тогда как искомый идентификатор ответа (в атрибуте L {identity_url) может содержать дополнительную информацию для лучшего сохранения.

URL-адреса будут удалены из фрагментов для отображения. XRIs будет отображать человекочитаемый идентификатор (i-name) вместо постоянного идентификатора (i-номер).

Используйте идентификатор дисплея в своем пользовательском интерфейсе. Используйте L {identity_url} для запроса вашей базы данных или сервера авторизации.

От python-openid docs.

Смежные вопросы