Я внедряю систему входа на основе OpenID с LightOpenID . Следуя документации , я использую свойство $openid->identity
для установки и получения идентификатора, предоставленного пользователем:
Установите его перед вызовом authUrl () и получите после validate ().
Итак, я делаю следующее:
<?php
$openid = new OpenID;
if( !$openid->mode ){
if( isset($_POST['openid']) ){
// Auth required
$openid->identity = $_POST['openid'];
header('Location: ' . $this->authUrl());
exit;
}
}elseif( $openid->mode == 'cancel' ){
// Cancelled by user
}else{
if( $this->validate() ){
// Sucess
$user = $openid->identity;
}else{
// Error
}
}
Когда я тестирую систему с делегированием (я полагаю, это техническое имя: я ввожу свое доменное имя в поле для входа в систему и аутентифицируюсь у стороннего провайдера), получающаяся в результате идентичность не всегда один я изначально набрал, и это поведение, кажется, зависит от провайдера за кулисами. В частности, если я наберу http://example.com/
, Yahoo всегда вернет https://me.yahoo.com/XXXXXXXXXX#5ab6d
, где XXXXXXXXXX
- мое имя пользователя Yahoo. В результате я не могу надежно идентифицировать постоянных пользователей: как только они поменяют поставщиков, они потеряют данные своей учетной записи на моем сайте:
["openid_claimed_id"] => string(37) "https://me.yahoo.com/XXXXXXXXXX#5ab6d"
["openid_identity"] => string(31) "https://me.yahoo.com/XXXXXXXXXX"
Мои вопросы:
- Правильно ли это поведение?
- Мой код неверен?
(Пожалуйста, исправьте меня, если я неправильно использую какой-либо термин. Все, что связано с OpenID, имеет тенденцию к чрезмерному усложнению, особенно терминология.)