Сбой входа в систему с помощью OpenID - PullRequest
6 голосов
/ 18 ноября 2011

Я хочу внедрить систему входа OpenID с последней версией LightOpenID . Я тестирую пример с исходным кодом построчно (я только что заменил localhost на $_SERVER['HTTP_HOST'] в конструкторе).

Проблема заключается в том, что все отлично работает в моем блоке разработки в частной сети (PHP / 5.3.6 в Windows Vista), но проверка всегда происходит на моем сервере жизни в общедоступной сети HSP (PHP / 5.3.3 в CentOS) .

Я добавил var_dump() вокруг, и я могу вам сказать, что обе копии кода выдают одинаковые параметры запроса и получают точно такие же параметры ответа (через GET). Только openid.assoc_handle, openid.sig, openid.response_nonce и openid.return_to имеют разные значения, что, я полагаю, является ожидаемым поведением.

Тем не менее, мое устройство разработки получает это от поставщика OpenID (независимо от того, какой я использую):

is_valid:true
ns:http://specs.openid.net/auth/2.0

... и мой живой лис получает это:

is_valid:false
ns:http://specs.openid.net/auth/2.0

В нем не задействованы символы, не относящиеся к ASCII, поэтому это не может быть проблемой кодирования. Должно быть, что-то не так в моем хостинге, но я просто не могу понять, что.

Мне нужны предложения о возможных причинах и советы по устранению неполадок.

Ответы [ 2 ]

11 голосов
/ 19 ноября 2011

Я выделил проблему и нашел обходной путь.Метод request() делает автоматическое обнаружение, чтобы выяснить, как стабилизировать HTTP-соединения:

protected function request($url, $method='GET', $params=array(), $update_claimed_id=false)
{
    if (function_exists('curl_init')
        && (!in_array('https', stream_get_wrappers()) || !ini_get('safe_mode') && !ini_get('open_basedir'))
    ) {
        return $this->request_curl($url, $method, $params, $update_claimed_id);
    }
    return $this->request_streams($url, $method, $params, $update_claimed_id);
}

В моем окне разработчика используется CURL, но в моем живом окне он использует file_get_contents(), потому что проверка не проходит.Причина в том, что директива open_basedir не пуста.

Если я заставлю LightOpenID использовать CURL, все пройдет гладко.


Обновление № 1: LightOpenID был прав, когда решил, что локон не может быть использован.Я обнаружил это в файле журнала:

Невозможно активировать CURLOPT_FOLLOWLOCATION, когда включен безопасный_мод или установлен open_basedir

Что касается версии file_get_contents(), я подозреваю, что яЯ нашел опечатку в библиотеке:

Index: lightopenid/openid.php
===================================================================
--- lightopenid/openid.php  (0.60)
+++ lightopenid/openid.php  (working copy)
@@ -349,7 +349,7 @@
             $this->headers = $this->parse_header_array($http_response_header, $update_claimed_id);
         }

-        return file_get_contents($url, false, $context);
+        return $data;
     }

     protected function request($url, $method='GET', $params=array(), $update_claimed_id=false)

Я уведомил автора, и он подтвердил, что это ошибка.Я сообщу, если это будет исправлено.

Обновление № 2: Ошибка была исправлена ​​ в главной ветке в июне 2012 года. Она все еще не является частью стабильнойрелиз, но его можно загрузить из репозитория .

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

Просто выстрел в темноте, но когда я работал с OpenID (не lightopenid), а с библиотекой для CodeIgniter, у меня возникла похожая проблема, когда мои разрешения были неправильно установлены для папки кэша nonce.Может быть, это простой вопрос разрешения для хранения?

...