Yahoo возвращает другой идентификационный URL при использовании OpenID с делегированием - PullRequest
1 голос
/ 18 ноября 2011

Я внедряю систему входа на основе 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, имеет тенденцию к чрезмерному усложнению, особенно терминология.)

1 Ответ

2 голосов
/ 18 ноября 2011

Насколько я знаю, это некорректное поведение со стороны провайдера.

Yahoo (и AOL, кстати) просто делает это. Единственный способ исправить это - начать использовать другого поставщика.

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

...