Janrain PHP-OpenID и Google/Yahoo
Я использую Janrain PHP-OpenID 2.1.3, и мне удалось заставить его работать со всеми провайдерами, которые у меня есть, за исключением Google и Yahoo. Основное отличие здесь заключается в том, что Google и Yahoo, в отличие от большинства других провайдеров, не используют URL-адрес, специфичный для пользователя, а скорее всего используют инфраструктуру обнаружения пользователей на своем конце - которая выдает структуру Janrain по умолчанию для цикла, а затем пытается начать запрос auth.
Из того, что я видел, похоже, что это, вероятно, открытие YADIS, которое выдает ошибку, которая должна быть обойдена, поскольку обнаружение находится в конце Google или Yahoo, но я не уверен. Для меня это большой неофициальный опыт обучения, и мне не удавалось найти документацию, которая может помочь мне в этом. Любые советы будут очень признательны.
Изменить: У меня возникает конкретная проблема: когда вызывается функция begin() для URL-адреса Google или Yahoo, я получаю null-возврат. Эта функция находится в Auth/OpenID/Consumer.php для справки.
Ответы
Ответ 1
Хорошо, мне наконец удалось исправить библиотеку... Я объяснил все здесь (вы также можете скачать библиотеку php-openid после моего меняется).
Мне нужно было сделать то, что предложил Павел Тарьян, но также мне нужно было изменить Auth_OpenID_detectMathLibrary
и добавить ключевое слово static
к множеству функций. После этого кажется, что он работает отлично, хотя это не идеальное решение... Я думаю, что кто-то должен переписать всю библиотеку в PHP 5...
Ответ 2
У меня была такая же проблема в Windows XP. Исправлено активированием расширения завитка. Для этого раскомментируйте в php.ini строку
extension=php_curl.dll
удалив ; перед ним, если таковой имеется. Перезапустите apache.
Также для корректной работы окон вам необходимо определить Auth_OpenID_RAND_SOURCE как null, поскольку в Windows у вас нет случайного источника. Вы можете сделать это, добавив строку
define('Auth_OpenID_RAND_SOURCE', null);
в CryptUtil.php перед первой строкой кода
if(!defined('Auth_OpenID_RAND_SOURCE')){
Даже если завиток не включен, API должен работать, используя вместо этого Auth_Yadis_PlainHTTPFetcher для связи через HTTP. В случае с Google и Yahoo вам нужно https, поэтому он работает только в том случае, если open_ssl включен (Auth_Yadis_PlainHTTPFetcher:: supportSSL должен вернуть true).
Ответ 3
У меня была точно такая же проблема, и мне потребовалось почти 2 часа, чтобы отследить проблему. Jan Rain OpenId lib требует "DOM или domxml PHP XML" (https://github.com/openid/php-openid), но он будет терпеть неудачу, когда ни один из них не будет доступен!
В моей простой установке CentOS:
yum install php-xml
исправлена проблема (я использую это репо: http://blog.famillecollet.com/pages/Config-en).
Ответ 4
Эта библиотека должна отлично работать с Yahoo и Google. Вы можете увидеть онлайн-демо для этой библиотеки и попробовать сами, используя "yahoo.com" или " https://www.google.com/accounts/o8/id", чтобы проверить его на эти два OP.
У Google есть идентификатор для ввода, потому что он все еще находится в бета-версии и еще не подтолкнул их идентификатор OP как "google.com".
Ответ 5
Используете ли вы пример RP? Могу ли я предложить вам представить подробную ошибку в http://trac.openidenabled.com/trac/newticket?project=php-openid или подробный запрос через список рассылки.
Поддержка direct_mode действительно работает с библиотеками, если они реализованы правильно. Я (и другие) также был бы рад помочь вам на IRID-канале OpenID irc.reenode.net в #openid. Мой псевдоним вялый.
Ответ 6
Я согласен с частью сертификата - для меня установка пакета ca-сертификатов (на дебианных системах: apt-get install ca-certificates), а перезапуск веб-сервера разрешил проблему google/yahoo. Не моя идея, а вместо этого предложила fooobar.com/questions/508425/...: -)
Ответ 7
Это потому, что в php включена поддержка завивки. Без этого он не может получить контент https. По крайней мере, это то, что я обнаружил. Когда я попытался получить yahoo или google, у него не получилось с сообщением об ошибке "Ошибка аутентификации, а не действительный OpenID", но когда я включаю php_curl, он работает правильно.
Ответ 8
Убедитесь, что ваш сервер зависает с включенным протоколом https. Это решило это для меня.
см. этот поток.
Вот быстрый script, чтобы проверить его. Загрузите на свой сервер, затем загрузите его через браузер.
<?php
error_reporting(E_ALL);
// create curl resource
$myurl = 'https://<YOURACCOUNT>.myopenid.com';
$curl_handle=curl_init();
curl_setopt($curl_handle,CURLOPT_URL, $myurl);
curl_setopt($curl_handle,CURLOPT_CONNECTTIMEOUT,2);
curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER,1);
$buffer = curl_exec($curl_handle);
if (empty($buffer))
{
print "Sorry, cannot access $myurl .<p>". curl_error($curl_handle);
}
else
{
print $buffer;
}
curl_close($curl_handle);
?>
Если он вернет "Протокол https не поддерживается или отключен в libcurl", тогда вы знаете, что делать.
Я попробовал это, используя мою учетную запись gmail, и это работает, но это приводит к 301 постоянному rediret, что имеет смысл.
Ответ 9
Я загрузил последние библиотеки, и я получаю те же неудачные результаты при использовании Yahoo!. Я не пробовал Google.
Если я пытаюсь использовать http://www.yahoo.com, я получаю сообщение об ошибке авторизации, но он возвращает мой правильный адрес me.yahoo.com, Если я попытаюсь войти с помощью моего my.yahoo.com url, тогда я получаю сообщение об ошибке, чтобы ввести действительный URL OpenID.
Ответ 10
Другая потенциальная разница заключается в том, что Google и Yahoo используют HTTPS, и если ваша установка PHP или SSL неверно сконфигурирована (возможно, отсутствующие сертификаты CA), то ваш код OpenID не сможет установить связь или завершить вызов check_authentication.
Но без сообщений об ошибках или журналов я не могу сказать, какой тип сбоя вы ищете.
Ответ 11
Спустя пару лет слишком поздно, но это может быть актуально для пользователей, использующих библиотеку Janrains PHP OpenID 2.2.2 на платформе Windows. Я все еще на PHP 5.2.17.
Мой простой тест, просто чтобы убедиться, что библиотека связывается с Google, было использование программы examples/discover.php и передать URL OpenID Googles (https://www.google.com/accounts/o8/id).
В соответствии с инструкциями стандартными шагами являются включение GMP (uncomment extension = php_gmp.dll) и CURL (uncomment extension = php_curl.dll). XML уже должен быть включен.
Вам также может потребоваться извлечь пакет в contrib/google и убедиться, что google_discovery.php и ca-bundle.crt находятся в Auth/OpenID.
Дополнительный параноид может начинаться с примеров /detect.php, чтобы убедиться, что они правильно настроены. Ожидается, что вы пройдете все тесты, кроме теста криптографической случайности. Для этого вам нужно добавить
define('Auth_OpenID_RAND_SOURCE', null);
вверху примеров /detect.php. И пока вы там, добавьте это к примерам /consumer/common.php(поскольку examples/discover.php использует его).
Теперь, даже после всего этого, обнаружение URL-адреса Google OpenID не удалось. Я получал CURL error (60): SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
в журнале ошибок php.
В среде Windows вам понадобится определение для CURLOPT_CAINFO. Для моего быстрого теста я добавил curl_setopt($c, CURLOPT_CAINFO, dirname(__FILE__)."/../OpenID/ca-bundle.crt");
перед операторами curl_exec() в Auth/Yadis/ParanoidHTTPFetcher.php.
Это позволило example/discover.php открыть службы, предлагаемые URL-адресом Google.
В качестве более долгосрочного решения для установки CURLOPT_CAINFO в Windows вы можете обратиться к fooobar.com/info/363902/..., чтобы добавить параметр в свой php.ini.