Как отличить / идентифицировать пользователей с OpenID, не запрашивая поля SReg? - PullRequest
5 голосов
/ 25 июня 2010

Я играл с PHP-библиотекой JanRain OpenID, в основном следуя инструкции , которую я нашел в ZendZone .

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

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

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

Это не сработало для меня, и , очевидно, не будет работать с некоторыми поставщиками , поэтому я был взволнован, когда наткнулся на функцию 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, изменится.

Ответы [ 4 ]

5 голосов
/ 01 июля 2010

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

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

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

2 голосов
/ 25 июля 2010

Проблема заключалась в том, что OpenID Google являются уникальными для каждого домена ; Я отсутствовал, чередуя перемены между http://www.mysite.com и http://mysite.com, что привело к изменению URL-адреса идентификатора OpenID!

1 голос
/ 06 сентября 2012

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

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

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

Из документов python-openid .

1 голос
/ 01 июля 2010

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

...